Web安全解析报错注入攻击原理
目录
- 1.报错注入攻击
- 2.报错注入代码分析
1.报错注入攻击 报错注入攻击的测试地址:http://127.0.0.1/sqli/error.php?username=1。
访问该网址时,页面返回ok,如图28所示。
文章图片
图28 访问username=1时页面的的结果
访问http://127.0.0.1/sqli/error.php?username=1',因为参数username的值是1',在数据库中执行SQL时,会因为多了一个单引号而报错,输出到页面的结果如图29所示。
文章图片
图29 访问username=1'时页面的的结果
通过页面返回结果可以看出,程序直接将错误信息输入到了页面上,所以此处可以利用报错注入获取数据。报错注入有多种格式,此处利用函数updatexml()延时SQL语句获取user()的值,SQL语句如下所示。
' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
Updatexml()函数:Updatexml(xml_target,xpath_expr,new_xml)
xml_target
:需要操作的xml片段xpath_expr
:需要更新的xml路径(Xpath格式)new_xml
:更新后的内容其中0x7e是ASCII编码,解码结果为~,如图30所示。
文章图片
图30 利用updatexml获取user()
然后尝试获取当前数据库的库名,如图31所示,语句如下所示。
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
文章图片
图31 利用updatexml获取database()
接着可以利用select语句继续获取数据库中的库名、表名和字段名,查询语句与Union注入的相同。因为报错注入只显示一条结果,所以需要使用limit语句。构造的语句如下所示。
' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+
结果如图32所示,以此类推,可以获取所有数据库的库名。
文章图片
图32 利用报错注入获取数据库名
如图33所示,构造查询表的语句,如下所示,可以获取数据库test的表名。
' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='test' limit 0,1),0x7e),1)--+
文章图片
图33 利用报错注入获取数据库表名
2.报错注入代码分析 在报错注入页面中,程序获取GET参数username后,将username拼接到SQL语句中,然后到数据库查询。如果执行成功,技术处ok;如果出错,则通过echo mysqli_error(@&con)将错误信息输出到页面(mysqli_error返回上一个MySQL函数的错误),代码如下所示。
输入username=1'时,SQL语句为select *from users where `username`=‘1'。执行时,会因为多了一个单引号而报错。利用这种错误回显,我们可以通过floor()、updatexml()等函数将要查询的内容输出到页面上。
以上就是Web安全解析报错注入攻击原理的详细内容,更多关于Web安全报错注入攻击的资料请关注脚本之家其它相关文章!
推荐阅读
- NeuVector 会是下一个爆款云原生安全神器吗()
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- spring|spring boot项目启动websocket
- Android系统启动之init.rc文件解析过程
- OC:|OC: WKWebView详解
- 小程序有哪些低成本获客手段——案例解析