php代码审计之任意文件读取漏洞

前言:

任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取的配置信息甚至系统重要文件,当然,严重的话, 就可能导致SSRF,进而漫游内网。

代码审计:

这次审计的代码,还是之前的一个审计靶场,个人说过是比较适合初级审计人员的一个靶场,里面包含了常见的漏洞。废话不多说,看步骤。
第一步:首先我们通过全文搜索的方式搜索:file_get_contents结果搜索到了一个名为user/avatar.php的文件,代码的内容如下:
可以看到通过file_get_contents获取到了$_SESSION['avatar']的值。
php代码审计之任意文件读取漏洞_第1张图片
第二步:通过全局搜索的方式跟踪变量$_SESSION['avatar']看该变量是如何而来的。
最后搜索到文件名为user\updateAvatar.php通过查看源代码得知,该文件是用来判断头像上传的文件。代码如下:
大致的意思就是通过is_pic函数判断上传的头像是否合法,如果合法则定义一个上传路径$avatar
然后将上传的缓存文件直接存放到上传的路径中去$avatar,随后执行更新的sql语句,将头像路径$avatar写入到数据库中,最后执行 $_SESSION['avatar']=$avatar 直接将路径的地址复制给$_SESSION['avatar']
php代码审计之任意文件读取漏洞_第2张图片第三步:通过代码审计得知$_SESSION['avatar']值的由来,判断是否可以构造$avatar为其他任意文件路径,判断$avatar是由$uploaddir /u_ time() _ $FILES['upfile']['name']构造而来,最后通过sql语句去执行,那么这里我们构造sql语句为update users set user_avatar='$avator',user_avatar='$avatar where user_id={$_SESSION['user_id']}'这里用到了sql语句执行update时的特性,如果更新的字段是两个一摸一样的话,那么此时update更新的值是以后面的字段为准的。
这里我们构造的值为',user_avatar='2' where user_name ='test' #.png也就是我们上传图片时的命名字,开启burp来进行抓包。
php代码审计之任意文件读取漏洞_第3张图片第四步:执行了以后通过burp查看是302跳转的,此时,我们打开mysql查看用户头像信息,看是否改变成了2。
可以看到是成功并执行了。
在这里插入图片描述第四步:此时我们在上传的时候只要修改对应2的值,即可读取到其他敏感文件了,重新将值构造为',user_avatar='../sys/config.php' where user_name ='test' #.png经过测试…/sys/config.php需要修改为16进制为0x2e2e2f7379732f636f6e6669672e706870
此时对应的数据库中数据也被修改。
在这里插入图片描述第五步:通过burp抓包,直接访问user/avatar.php文件,直接读取config.php文件内容。
php代码审计之任意文件读取漏洞_第4张图片

总结:

首先通过全局搜索的方式找到了file_get_contents函数,并且一步步的逐一定位到变量$_SESSION[‘avatar’]变量的值是通过上传头像时获得的,并且时可控的,判断是否进行过滤,然后进行值的控制,最后成功读取敏感文件。

你可能感兴趣的:(php代码审计)