php代码审计工作,PHP代码审计 | CN-SEC 中文网

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

代码审计两个关键点:

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

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

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

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

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

7df30076a9787e42b04328e4798272dd.png

前台

047ff35044ba0fb6a7e5dd5b56e4f01d.png

后台

f2f06e8ccb8cee3b52e1a713d1eb5c3c.png

直接附上审计点

1、xss反射型

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

2c8fd275b7bcdd21aade0afa152c9f9f.png

输入,顺利的出现弹框。

f4625ad107586aa517742107ae00857a.png

b411ceede8863f8f5e006e73525fd41e.png

来看问题出在哪?

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

0f3ee739a229b181f161bce6caef2643.png

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

85cf7d786f6a5688c98866d16a7842ca.png

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

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

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

866df34fccfbadf8afc1e968c7e0a24c.png

是什么原因呢?

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

8de073c9ec95a3b110dd1a271b008d8e.png

重点,找输出点。

543f9a50660a8c45a93795ddab11faed.png

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

fd82384a7453469a0c125e3b87cecc15.png

298a74af711af25f174d543e6295931d.png

2、存储型xss

留言

b6eb167c40460799be9b55059de5fe74.png

在后台可看到留言记录。

52c9cf7618a9eed09dd2f199d6799319.png

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

27453108a8f821c2d611067c0b6adfc1.png

在后台也会弹框

4aad0f4d67804aee92af28a2c382b426.png

跟进代码

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

5e353eb0b87b951aaf34f6e633d3d26e.png

3、SQL注入

看到后台登录处

56fd94e79fa71480b1806325e20ae519.png

定位到login.php

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

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

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

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

84fbe1ba00067fe04df9196900d2ce1c.png

跟进inc.php

ca17c9648d604ef1e071d9e98998362a.png

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

ca91ab80978608118dd3239167b14c49.png

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

ab4d50bee41311ceecdb0bf915a8af28.png

第二处疑似注入点

可控参数cid

4ab87b6d8eeaa817554f8116609eb4db.png

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

85f2b9b05218da7e95f312753afdf8a8.png

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

定位到vlist.php

92ce024f33542d5b826e9b4114f158e9.png

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值