记一次详细的代码审计 代码审计与漏洞分析网上下载了一个小型的cms源码,将它搭建在本地,当我们看到如下界面时,最容易想到的是网上有公开的漏洞可以进行利用,通过网上查找并没有看到…
记一次详细的代码审计
代码审计与漏洞分析
网上下载了一个小型的cms源码,将它搭建在本地,当我们看到如下界面时,最容易想到的是网上有公开的漏洞可以进行利用,通过网上查找并没有看到相关漏洞,原因在于网站使用的人数过少,只是小型网站,看到登入框这些的话就想到业务安全漏洞进行利用,但是通过测试,结果都无效,此时只能自己通过代码审计啦。
先熟悉一下网站的目录,对于我这个小白来说,掌握的漏洞并不是很多,先拿比较熟悉的SQL注入来尝试,由于是自己本地搭建的环境,可以知道数据库的账号密码,使用MySQL的监控插件,这个监控插件可以看到网站运行时MySQL的执行语句。
刷新一下页面,执行的语句如图,看到这些语句是不是特别惊喜,因为我们在SQL注入时也常用这些语句,出现这些执行的语句就有可能会产生注入,观察是否有变量。那么此时的难题又来了,怎么判断哪个是变量呢?FROM后那些是列名和表名、limit后面的为自带参数,这些明显都不是数据库执行语句的变量,而这个127.0.0.1很明显是变量,变量名称为ip。
于是寻找首页文件,因为这些语句是加载首页文件而执行的SQL语句,找到首页文件分析这些语句是如何来的。搜索是否有SQL语句:select,发现代码中都没有SQL语句,搜索IP也没有发现任何有用的信息。
两个都没有的话,这下又该怎么办呢?思考一段时间,于是想到可能存在包含文件,利用包含文件来执行这些语句。现在针对的语句主要是有变量的语句,开始采用全局搜索,搜索刚才执行的特定语句,查找是否有文件有这个语句,发现这里有SQL语句。
在返回查看首页文件,查看是否有文件包含,发现包含了两个文件,意思就是说刚才搜索的SELECT *FROM ‘dd WHERE ‘ip’这个语句可能是在php/function.php文件中定义。
查看这个文件,进行查找,发现有ywdd这个函数,获取了变量ip,并且SQL语句在该函数中执行。
接着确认一下首页文件,查看是否有这个函数,发现确实有引用该函数。
刚才我们数据库接收的变量值是127.0.0.1,getip函数获取的参数为什么是127.0.0.1呢?它的值又是从哪里来的呢?全局搜索一下该函数,找到该函数的定义函数,问题又来了,这么多函数都有出现getip函数,怎么确定这个函数getip的定义函数呢。其实很明显可以知道/php/function中的getip函数为定义函数,其他的函数都是调用getip函数。
查看/php/function文件,可以观察到realip为getip函数返回的值。realip是怎么得到127.0.0.1的呢?HTTP_X-FORWARDED_FOR是服务器变量,普遍用于获取客户端ip并存入数据库。分析该函数的语句,则realip的值为HTTP_X-FORWARDED_FOR变量传入的值,并且没有过滤SQL注入语句。此时,利用HTTP_X-FORWARDED_FOR变量来修改realip的值,又怎么修改传入呢?
使用burpsuite抓取首页文件的数据包,并且添加X-Forwarded-For: 8.8.8.8,这样就可以传入参数。
将其发送至Repeater中,点击发送,发现127.0.0.1改成了8.8.8.8,由于上面的代码并没有过滤SQL注入语句,于是可以确定这个网站存在注入漏洞。
漏洞利用
这里直接使用终端查看dd这个表来确定有多少个列名,可知有五个列名。
构造SQL中的语句,让它爆出相应数字。
爆破数据库名,版本,用户,由于这个是SQL注入中的内容,这里就不一一演示。
心得
代码审计需要我们平时多注意可能存在漏洞的函数,并不一定要一字不漏的记下每一个普通函数,需要用的时候能够快速通过各种方法找到就行。以前每次学一门语言就是从头到尾学一遍,结果都没有记住啥,深度也不够深,其实个人建议有的时候多去看看那些文章,敲一些经典的实验题,效果可能更好。学安全需要懂的语言非常多,因为人的记忆是有限的,我们要平时善于总结,多去思考。虽说我是一个菜鸡,但是不管自己亦弱或亦强,我们都需要继续向前走。非常感谢奇安信给我们提供一个这么好的平台,超级好评,有错误还会细心的教你改。
- 本文作者: Honeypot
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/227
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!