SQL注入之手工盲注语句
我们首先明白两个问题
什么是盲注?
盲注就是注入过程中,语句不回显到页面中
什么是盲注?
盲注就是利用一些方法进行判断或者尝试这个过程就是盲注
盲注可以分为3类:
1.基于布尔的SQL盲注(这里就是True/False)
2.基于报错的SQL盲注
3.基于时间的SQL盲注
在学习盲注前,我们需要先学习几个SQL语句是我们接下来可能会用到的
1.构造逻辑判断的SQL语句(基于布尔的SQL盲注)
在这里主要学的:
left()
substr()
ascii()
mid()
ord()等同ascii()
regexp正则表达式
like注入
我们挨个来学习它的语法
1.1 left()函数
语法:left(str,length) 返回最左边N个字符
放数据库操作看看
可以看到,我们当前的数据库位数就以length这个位置出现多少位,当然还有right这个函数是反着来的
构造payload:
1.2 substr()函数
语法:substr(字符串,开始,长度) 截取字符串
可以看到我们数据库还是这样出来的,当然长度那个位置可以改2,4等等
当然这个是和substring()函数是一样的功能都是截取字符串,大家自行测试,语法也是一样的 substring(字符串,开始,长度)
构造payload:
substr(database(),1,1)=‘t’ 来判断返回
1.3 ascii() 函数
语法:ascii(字符串) 返回字符串的ascii码
构造payload:
这里其实就已经构造了在上图就是了通过更改substr(database(),N,1)=num
N的位数,再更改num的参数,来判断ASCII码
1.5 mid() 函数
语法:mid(字符串,开始,长度) 截取字符串的一部分
构造payload:
1.6 ord()函数
语法:ord(字符串) 跟ascii的效果是一样的都转换成ascii码
构造payload:
这里可以去掉单引号
1.7 regexp 正则表达式
语法:regexp '判断条件'
因为这个东西对初学者不是很友好,建议下去自行自学正则表达式
^[a-z] 判断开始的字符是不是a-z的范围
后面又做了个^[1-9] 判断数据库名开始是不是在1-9的范围,显然不是返回了一个0
构造payload:
依次类推 判断每个字符即可,当然是区分大小写的
两个实例分析:
select * from users where id=1 and 1=(if(database() regexp '^[a-z]',1,0));
这句什么意思呢,首先说下if这个语法 if(条件,1,0)
如果条件满足就返回1,不满足就返回0
这里如果判断数据库名第一个字符确实在a-z的范围内,那么就返回1,相当于是 and 1=1 是正确的
select * from users where id=1 and 1=database() regexp '^[a-z]'
这个就简单了 直接判断数据库名 第一个字符是否在 a-z的范围内,是就返回row 1 不是返回 row 0
当然正常正则表达式来注入会比这种情况只会复杂
1.8 like匹配
语法:like '条件'
其实跟上面正则是差不多的
like具体用法移步: like用法
构造payload:
这个已经在上图构造了,其实就是更改like 'N' N的位置上的参数进行匹配验证
2.基于报错的SQL盲注
构造payload让信息通过错误提示出来
第一种方法:
select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))
来解读几个函数吧:count(), group by,floor() rangd(),concat()
count(*)---包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录。
我这有17行的存储数据。
group by 主要作用就是分组 以by后的条件分组 可以参考网址 group by
因为我这表不好分,我就没做演示了
floor() 的作用就是只返回整数部分,小数部分舍弃。 说白了就是保留整数
rand() 这个就简单了 随机数嘛
要配合floor来使用不然就是小数了
concat() 连接字符串
语法:concat(str1,str2)
再来解读我们的报错语句
select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))
查询information_schema数据库下的tables表的所有行,并且根据 连接数据库版本号以及随机整数来进行分组
当然这条是肯定行不通的,我们来看看结果
我这里多做了几个示范,可以看到我们的test数据库确实和后面的随机整数连接上了
当然如果rand() 被禁用了,我们可以通过用户变量进行报错
select min(@a:=1) from information_schema.tables group by concat(version(),@a:=(@a+1)%2);
第二条:exp()函数
这个我本机无法演示就没办法了
推荐个链接吧 exp()函数报错注入
第三条:updatexml()函数
语法:updatexml (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
看下我们的payload
select updatexml(1,concat(0x7e,(SELECT user(),0x7e),1);
concat连接字符串,查询user() 被连接成一个新的字符串了
但是并不符合xpath的语法,所以报错
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理