代码审计结合黑盒和白盒的方法。这里多数地方是先黑盒,发现问题之后,审计代码问题在哪以及如何解决。白盒包括使用自动化代码审计工具定位可控变量,进而逐个排查变量传入函数是否有安全问题。
代码审计两个关键点:
1、用户的输入都是不安全的
2、能传入函数的变量都是危险的
带着这两个点,进入这次学习之旅!
在服务器搭建cms既然是黑白结合的方法,代码审计之前附上网站目录结构以及前后台。
目录结构。大概是admin目录存放后台代码,css目录存放前端样式,system存放包等。
前台
后台
直接附上审计点
1、xss反射型
在首页看到输入框,很自然的想到测试xss
输入,顺利的出现弹框。
来看问题出在哪?
找到根目录search.php,通过post变量取得wd的值赋给变量q,用q去外链搜索赋给变量seach
重点看输出点在哪,q是取得用户传入的值。在搜索页面上,出现输出点<?php echo $q?>,这里没有对变量q取得的值进行处理,直接echo,导致xss反射型漏洞。
另外,在不熟悉业务逻辑架构的情况下,如何查找输出点?
grep -rn“关键字,或者网页附近关键字”
在前台页面继续黑盒,发现tv.php?m=/dianshi/list.php?cat=all&page=1,有多处可控变量,但是无法弹框
是什么原因呢?
先定位tv.php,这里包含了system下面的其他php文件,并且用get方法接收page值赋给page变量。
重点,找输出点。
以为page值是我们可控的,但是继续跟进echo输出点,发现m和page都是不可控的,所以无法弹框。
2、存储型xss
留言
在后台可看到留言记录。
继续留言,持续刷新会一直弹,说明写入了数据库
在后台也会弹框
跟进代码
先是留言脚本book.php,用post方法接收userid,判断非空后传入数组data,同样用post方法接收content,到那时经过addslashes函数处理后再传入data数组。addslashes函数可以防御SQL注入攻击(根据正则匹配,特殊符号前面增加反斜杠)但是addslashes并不能彻底解决注入的问题(如数字型参数,以及mysql的gbk编码问题)。这里虽然包含了system下面的inc.php,但是在包含的文件中,并没有看到htmlspecialchars或者具有过滤尖括号 或者斜杠等特殊符号的函数,因此直接将经过arrtoinsert处理后的键值对插入数据库表,造成xss存储型漏洞。
3、SQL注入
看到后台登录处
定位到login.php
首先是判断验证码是否正确。判断3者是否非空后,用post接收用户名和密码分别赋给变量a_name以及a_password。
问题来了,变量a_name以及a_password没有经过处理,直接拼接SQL语句,这里就很明显的会导致SQL注入。
这里只需要闭合双引号+sql注入语句+注释,即可进行常规注入探测。
但是在注入的时候发现不成功,sqlmap也跑不通,确实是没有对变量进行处理的函数。后面发现require_once('../system/inc.php');包含了inc.php这个文件。
跟进inc.php
在libraru.php中看到。如果没有开启魔术引号方法,所有传进来的参数,都会经过addslashes_deep函数处理。
跟进addslashes_deep函数,传入此函数一个变量,如果为空,则返回变量值本身。如果非空,则利用递归实现使用反斜杠引用get或post传入的值。所以闭合双引号的时候,双引号无法逃逸,以至于不能造成注入。所以,此处利用require_once包含在其他地方写的脚本函数做了过滤而无注入。
第二处疑似注入点
可控参数cid
加单引号,出错了,可能存在注入,而且,此处和上面一处不一样,这里是数字型参数。尝试注入。
SQL探测三部曲走完确定存在注入。这里注入就不做过多介绍。重点看代码,为什么会存在注入。
定位到vlist.php
用GET方法接收的cid参数值没有过滤直接拼接SQL语句,与上面不同的是,此处时候数字型,所以以上的addslashes函数并没有起到防御的作用。
好了这是一片入门级的代码审计,还有很多代码审计的漏洞点还未审,比如文件上传、代码执行亦或是该cms的一些业务逻辑。多数是从可以拿shell的点,先审计。
代码审计从大的方向来说分白盒和黑盒,白盒可以先看代码,用类似seay代码审计系统自动扫描一遍,定位关键函数、变量,再逐个排查。黑盒可以先站在渗透测试的角度,先去发觉未知的漏洞,进而再回到代码。