WEB漏洞—SQL注入之查询方式及报错盲注

发布时间 2023-05-29 12:07:07作者: 执小汐

 

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

 

#补充:上课的Access暴力猜解不出的问题?

Access偏移注入:解决列名获取不到的情况
查看登陆框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况

参考笔记:https://www.fujieace.com/penetration-test/access-offset-injection.html

 

SQL语句网站应用
 
1.select查询数据
 在网站应用中进行数据显示查询操作
 例: select * from news where id=$id
 
2.insert插入数据
 在网站应用中进行用户注册添加等操作
 例:insert into news(id,ip,time,url) values(1,127.0.0.1,18:00,'xxx')

3.delete删除数据
 后台管理里面删除文章删除用户等操作
 例: delete from news where id=$id

4.update更新数据
 会员或后台中心数据同步或缓存等操作
 例: update user set pwd='$p' where id=2 and username=' admin'

5.order by排序数据
一般结合表名或列名进行数据排序操作
例: select * from news order by $id
例: select id , name , price from news order by $order

 

 

二、SQL语句盲注

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:

1、基于布尔的sQL盲注-逻辑判断 regexp, like , ascii,left, ord , mid
2、基于时间的sQL盲注-延时判断 if ,sleep
3、基于报错的sQL盲注-报错回显 floor, updatexml, extractvalue

 

基于报错的 SQL 盲注-报错回显
floor,updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c

 

1.insert语句

通过浏览器抓包,修改数据

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

这里的version()也可以修改成database()等,将注意语句放在语句的其他位置是可以的,注意看网站提交的数据

 

2.update语句

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

与insert一样的操作,原理一致

3.delete语句

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

 一样的操作,但是要对添加的语句进行url编码(ctrl+u)

 

参考:

like 'ro%'

#判断 ro 或 ro...是否成立

regexp '^xiaodi[a-z]' #匹配 xiaodi 及 xiaodi...等

if(条件,5,0)

#条件成立 返回 5 反之 返回 0

sleep(5)

#SQL 语句延时执行 5 秒

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

 

三、SQL时间盲注

基于时间的 SQL 盲注-延时判断

if,sleep

 

 1.sleep()

例:sleep(5)   #SQL 语句延时执行 5 秒

2.if

 例:if(条件,2,0)          #条件成立 返回 2 反之 返回 0

3.if+mid+sleep

判断数据库名称是不是以p开头如果是的话就延迟五秒输出
 

 

四、布尔盲注

布尔(Boolean)型是计算机里的一种数据类型,只有True(真)和False(假)两个值。一般也称为逻辑类型。

1.判断数据库长度  ?id=1%27 and Length(database())>7 --+

#left(a,b)从左侧截取 a 的前 b 位

2.截取数据库版本的前2位 ?id=1%27 and left(version(),2)=5. --+