PHP代码审计

  • A+
所属分类:代码审计

     代码审计结合黑盒和白盒的方法。这里多数地方是先黑盒,发现问题之后,审计代码问题在哪以及如何解决。白盒包括使用自动化代码审计工具定位可控变量,进而逐个排查变量传入函数是否有安全问题。

 

 

代码审计两个关键点:

1、用户的输入都是不安全的

2、能传入函数的变量都是危险的

 

带着这两个点,进入这次学习之旅!

 

       在服务器搭建cms既然是黑白结合的方法,代码审计之前附上网站目录结构以及前后台。

       目录结构。大概是admin目录存放后台代码,css目录存放前端样式,system存放包等。

PHP代码审计

 

前台

PHP代码审计

后台

PHP代码审计

 直接附上审计点

1、xss反射型

在首页看到输入框,很自然的想到测试xss

PHP代码审计

输入<script>alert(1)</script>,顺利的出现弹框。

PHP代码审计

PHP代码审计

来看问题出在哪?

        找到根目录search.php,通过post变量取得wd的值赋给变量q,用q去外链搜索赋给变量seach

PHP代码审计

        重点看输出点在哪,q是取得用户传入的值。在搜索页面上,出现输出点<?php echo $q?>,这里没有对变量q取得的值进行处理,直接echo,导致xss反射型漏洞。

PHP代码审计

另外,在不熟悉业务逻辑架构的情况下,如何查找输出点?

grep -rn “关键字,或者网页附近关键字”

 


       在前台页面继续黑盒,发现tv.php?m=/dianshi/list.php?cat=all&page=1,有多处可控变量,但是无法弹框

PHP代码审计

是什么原因呢?

        先定位tv.php,这里包含了system下面的其他php文件,并且用get方法接收page值赋给page变量。

PHP代码审计

重点,找输出点。

PHP代码审计

        以为page值是我们可控的,但是继续跟进echo输出点,发现m和page都是不可控的,所以无法弹框。

PHP代码审计

 

PHP代码审计

2、存储型xss

留言

 

PHP代码审计

在后台可看到留言记录。

PHP代码审计

继续留言,持续刷新会一直弹,说明写入了数据库

PHP代码审计

在后台也会弹框

PHP代码审计

跟进代码

先是留言脚本book.php,用post方法接收userid,判断非空后传入数组data,同样用post方法接收content,到那时经过addslashes函数处理后再传入data数组。addslashes函数可以防御SQL注入攻击(根据正则匹配,特殊符号前面增加反斜杠)但是addslashes并不能彻底解决注入的问题(如数字型参数,以及mysql的gbk编码问题)。这里虽然包含了system下面的inc.php,但是在包含的文件中,并没有看到htmlspecialchars或者具有过滤尖括号 或者斜杠等特殊符号的函数,因此直接将经过arrtoinsert处理后的键值对插入数据库表,造成xss存储型漏洞。

PHP代码审计

3、SQL注入

看到后台登录处

PHP代码审计

定位到login.php

首先是判断验证码是否正确。判断3者是否非空后,用post接收用户名和密码分别赋给变量a_name以及a_password。

问题来了,变量a_name以及a_password没有经过处理,直接拼接SQL语句,这里就很明显的会导致SQL注入。

这里只需要闭合双引号+sql注入语句+注释,即可进行常规注入探测。

但是在注入的时候发现不成功,sqlmap也跑不通,确实是没有对变量进行处理的函数。后面发现require_once('../system/inc.php');包含了inc.php这个文件。

PHP代码审计

跟进inc.php

PHP代码审计

libraru.php中看到。如果没有开启魔术引号方法,所有传进来的参数,都会经过addslashes_deep函数处理。

PHP代码审计

跟进addslashes_deep函数,传入此函数一个变量,如果为空,则返回变量值本身。如果非空,则利用递归实现使用反斜杠引用get或post传入的值。所以闭合双引号的时候,双引号无法逃逸,以至于不能造成注入。所以,此处利用require_once包含在其他地方写的脚本函数做了过滤而无注入。

PHP代码审计

第二处疑似注入点

可控参数cid

PHP代码审计

加单引号,出错了,可能存在注入,而且,此处和上面一处不一样,这里是数字型参数。尝试注入。

PHP代码审计

SQL探测三部曲走完确定存在注入。这里注入就不做过多介绍。重点看代码,为什么会存在注入。

定位到vlist.php

PHP代码审计

GET方法接收的cid参数值没有过滤直接拼接SQL语句,与上面不同的是,此处时候数字型,所以以上的addslashes函数并没有起到防御的作用。

 


好了这是一片入门级的代码审计,还有很多代码审计的漏洞点还未审,比如文件上传、代码执行亦或是该cms的一些业务逻辑。多数是从可以拿shell的点,先审计。

代码审计从大的方向来说分白盒和黑盒,白盒可以先看代码,用类似seay代码审计系统自动扫描一遍,定位关键函数、变量,再逐个排查。黑盒可以先站在渗透测试的角度,先去发觉未知的漏洞,进而再回到代码。

 

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: