【代码审计】PHP SECURITY CALENDAR 2017 False Beard

个人博客地址

http://www.darkerbox.com

欢迎大家学习交流

环境:

https://www.ripstech.com/php-security-calendar-2017/

参考

https://xz.aliyun.com/t/2467

分析

class Login {
  public function __construct($user, $pass) {
    $this->loginViaXml($user, $pass);
  }

  public function loginViaXml($user, $pass) {
    if (
      (!strpos($user, '<') || !strpos($user, '>')) &&
      (!strpos($pass, '<') || !strpos($pass, '>'))
    ) {
      $format = '<?xml version="1.0"?>' .
        '<user v="%s"/><pass v="%s"/>';
      $xml = sprintf($format, $user, $pass);
      $xmlElement = new SimpleXMLElement($xml);
      // Perform the actual login.
      $this->login($xmlElement);
    }
  }
}

new Login($_POST['username'], $_POST['password']);

漏洞主要出现在strpos函数。

strpos主要是用来查找字符在字符串中首次出现的位置。

代码很明显。通过sprintf格式化字符串函数将参数拼接到xml中,中间的过滤使用的是strpos函数

作者的本意是通过strpos匹配到了<或者>。就退出判断。

strpos函数是返回字符串首次出现的位置。如果出现了。返回的是数字。如果没有匹配到。返回false。但是作者忽略了<可能在第一个字符。如果<在第一个字符。strpos返回的是0。然后取反变为true。绕过了if判断。

所以作者的if判断只能防御<不在第一个字符的字符串。

user=<"><injected-tag%20property="&pass=<injected-tag>

欢迎大家一起学习交流,共同进步,欢迎加入信息安全小白群

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vicl1fe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值