请选择 进入手机版 | 继续访问电脑版

SSS安全论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

产品
产品
团队
团队
版规
版规
查看: 3077|回复: 42

记一次PHP代码审计寻找注入点

[复制链接]
  • TA的每日心情
    开心
    2016-2-2 20:06
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2015-11-17 16:17:33 | 显示全部楼层 |阅读模式
    0x00 知识前提
    1. PHP提供了is_numeric函数,用来变量判断是否为数字。但是函数的范围比较广泛,不仅仅是十进制的数字
    [PHP] 纯文本查看 复制代码
    2.<code class="xml"><span class="php"><span[/align][align=left] class="hljs-preprocessor"><?php</span>
    3.<span class="hljs-keyword">echo</span> is_numeric(<span class="hljs-number">233333</span>);      [/align][align=left] <span class="hljs-comment"># 1</span>
    4.<span class="hljs-keyword">echo</span> is_numeric(<span class="hljs-string">'233333'</span>);   [/align][align=left] <span class="hljs-comment"># 1</span>
    5.<span class="hljs-keyword">echo</span> is_numeric(<span class="hljs-number">0x233333</span>); [/align][align=left]   <span class="hljs-comment"># 1</span>
    6.<span class="hljs-keyword">echo</span> is_numeric(<span class="hljs-string">'0x233333'</span>);  [/align][align=left] <span class="hljs-comment"># 1</span>
    7.<span class="hljs-keyword">echo</span> is_numeric(<span class="hljs-string">'233333abc'</span>);  [/align][align=left]<span class="hljs-comment"># 0</span>
    8.<span class="hljs-preprocessor">?></span></span></code>

    9.MySQL数据库同样支持16进制,也就是HEX编码。虽然不像is_numeric函数一样有着比较强的容错性,但还是能够完成如下操作。
    [PHP] 纯文本查看 复制代码
    [/align][align=left]10.<code class="cs">> <span class="hljs-function">insert[/align]
    [align=left] <span class="hljs-keyword">into</span> <span class="hljs-title">test</span> (<span[/align]
    [align=left] class="hljs-params">id, <span class="hljs-keyword">value</span></span>) <span[/align]
    [align=left] class="hljs-title">values</span> (<span class="hljs-params"><span[/align]
    [align=left] class="hljs-number">1</span>, <span class="hljs-number">0x74657374</span></span>)</span>;[/align][align=left]
    11.> <span class="hljs-keyword">select</span> * <span[/align]
    [align=left] class="hljs-keyword">from</span> test;
    12.| id | <span class="hljs-keyword">value</span> |
    13.| <span class="hljs-number">1</span>  | test  |</code>

    以上两点单独看起来都没什么问题,但如果遇到合适的场景,比如程序猿只是用is_numeric函数验证变量是否为数字,就很有可能插入一些特殊字符到数据库中。虽然不能造成直接的SQL注入,但危险的数据已经悄悄潜伏在了路边,就等你经过。

    0x10 寻找可利用的is_numeric
    我们现在已经知道了is_numeric是个危险的函数,全局搜索的结果有很多,我们进一步筛选一下:
    · 变量仅仅通过is_numeric判断是否为数字,没有经过Intval处理
    · 变量插入/更新数据库的时候没有加引号(二次注入,需要先引入数据)
    经过人肉筛选之后,我们得到了一个函数:
    [PHP] 纯文本查看 复制代码
    <code class="php"><span class="hljs-comment"># /app/public/action.class.php</span>[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">FormatValues</span><span class="hljs-params">(<span class="hljs-variable">$Values</span>)</span></span>{[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]    <span class="hljs-variable">$ValuesStr</span>=<span class="hljs-string">''</span>;[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]    <span class="hljs-keyword">foreach</span>(<span class="hljs-variable">$Values</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$k</span>=><span class="hljs-variable">$v</span>){[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]        <span class="hljs-keyword">if</span>(is_numeric(<span class="hljs-variable">$k</span>)){[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]            <span class="hljs-variable">$ValuesStr</span>.=<span class="hljs-string">','</span>.<span class="hljs-variable">$v</span>;[/color][/font][/align][align=left][font=Helvetica][color=#333333]        }<span class="hljs-keyword">else</span>{[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]            <span class="hljs-keyword">if</span>(is_numeric(<span class="hljs-variable">$v</span>)){[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]                <span class="hljs-variable">$ValuesStr</span>.=<span class="hljs-string">',`'</span>.<span class="hljs-variable">$k</span>.<span class="hljs-string">'`='</span>.<span class="hljs-variable">$v</span>;[/color][/font][/align][align=left][font=Helvetica][color=#333333]            }<span class="hljs-keyword">else</span>{[/color][/font][/align][align=left][font=Helvetica][color=#333333]
    [/color][/font][/align][align=left][font=Helvetica][color=#333333]                <span class="hljs-variable">$ValuesStr</span>.=<span class="hljs-string">',`'</span>.<span class="hljs-variable">$k</span>.<span class="hljs-string">'`=\''</span>.<span class="hljs-variable">$v</span>.<span class="hljs-string">'\''</span>;[/color][/font][/align][align=left][font=Helvetica][color=#333333]            }[/color][/font][/align][align=left][font=Helvetica][color=#333333]        }[/color][/font][/align][align=left][font=Helvetica][color=#333333]    }[/color][/font][/align]
    [align=left][font=Helvetica][color=#333333]    <span class="hljs-keyword">return</span> substr(<span class="hljs-variable">$ValuesStr</span>,<span class="hljs-number">1</span>);
    [AppleScript] 纯文本查看 复制代码
    }</code>
    这是个中间函数,我们搜一下哪里用到了这个函数。
    QQ图片20151117162225.png
    多个数据表模型都用到了这个函数,基本都是Update操作。现在的思路是利用接口将恶意代码Update进数据库,再通过其他接口,从数据库读恶意数据,在再次存到数据库的时候,进行注入。接下来的任务,是筛选能造成二次注入的点。
    0x20 二次注入点
    寻找二次注入的过程,是重复性的工作。根据全局搜索得出的多个模型,找到对应的控制层的代码,根据如下条件去筛选:
    · 恶意代码insert/update到数据库
    · 从数据库select数据,再将数据拼接到新的语句中(没有再次转义)
    举个例子,ask.model.php中,出现了五次FormatValues。
    游客,如果您要查看本帖隐藏内容请回复
    0x30 总结
    代码审计,有很多重复性的工作。拼的就是耐心和经验。这篇文章,算是手把手教如何审计二次注入漏洞了。之后会更多的关注PHP函数使用不当导致的漏洞,敬请期待。

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-17 19:54
  • 签到天数: 75 天

    [LV.6]常住居民II

    发表于 2015-11-17 16:27:55 | 显示全部楼层
    好深奥,看不懂你想表达什么
  • TA的每日心情
    郁闷
    2016-8-1 09:34
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2015-11-17 16:56:50 | 显示全部楼层
    支持~~~~~~~
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 08:37
  • 签到天数: 420 天

    [LV.9]以坛为家II

    发表于 2015-11-18 08:20:40 | 显示全部楼层
    就是来学习的啊
  • TA的每日心情
    奋斗
    2015-11-25 15:44
  • 签到天数: 36 天

    [LV.5]常住居民I

    发表于 2015-11-18 09:27:10 | 显示全部楼层
    回复是应该的,学习是必须的;所以是要看的~
  • TA的每日心情
    开心
    2017-1-13 22:13
  • 签到天数: 118 天

    [LV.6]常住居民II

    发表于 2015-11-18 10:04:47 | 显示全部楼层
    看不懂,编程知识有限
  • TA的每日心情

    2016-6-5 18:30
  • 签到天数: 126 天

    [LV.7]常住居民III

    发表于 2015-11-18 12:36:06 | 显示全部楼层
    管理员大牛厉害,表示看不懂 赞一个
  • TA的每日心情
    擦汗
    5 天前
  • 签到天数: 63 天

    [LV.6]常住居民II

    发表于 2015-11-18 13:35:46 | 显示全部楼层
    谢谢谢谢谢谢谢谢谢谢谢谢谢谢
  • TA的每日心情

    2015-11-25 13:12
  • 签到天数: 43 天

    [LV.5]常住居民I

    发表于 2015-11-18 15:21:21 | 显示全部楼层
    6666666666666666666666666
  • TA的每日心情
    擦汗
    前天 21:45
  • 签到天数: 153 天

    [LV.7]常住居民III

    发表于 2015-11-18 19:40:46 来自手机 | 显示全部楼层
    看帖回复是必须的
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    关注微信赢邀请码

    QQ|Archiver|手机版|网站地图|网页地图|SSS安全论坛 ( 黔ICP备15010987号  

    GMT+8, 2017-1-21 06:08 , Processed in 0.191775 second(s), 41 queries .

    Powered by SSS团队 X3.2

    © 2014-2015 Comsenz Inc.

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