之前提交了几个漏洞,官方说通过其他渠道知道漏洞了。
那么我就把这些漏洞全发出来,当做一个文章了,厂商如果都通过其他渠道得知的话请忽略。
既然这是一个基础教程文章,那么废话不多说,我们来看代码吧
首先这个系统的web代码框架如图:
这里的目录和文件结构如下:
attachements为附件目录
cachedata为缓存文件目录
config当然就是配置文件目录了
data和help无关紧要不用管了
include这里面都是全局处理函数内容了
libraries为系统全局使用的一些class文件
modules是这里最重要的目录,里面都是系统功能文件,待会主要看这面的内容
剩下的就是一些静态文件目录了
index.php就是这个系统的入口文件了
下面开始进入index.php,一步一步了解这个系统
前面都是一些系统设置内容
主要看最后一句,包含了一个init.inc.php文件,跟进
文件/include/init.inc.php
这里引入了全局配置文件config内容,全局函数处理内容include里面的内容
一般全局的过滤啊,参数处理啊等都在这些include的文件里面
注意最后:
一般的run函数出来了,就说明程序已经进入正常运行状态了,来看看run的处理过程
load_class函数在文件/include/common.inc.php
这里可以看到根据传入的class值,调用libraries目录里面的class文件
这里的class为Ngtos,所以加载的文件为:/libraries/Ngtos.class.php
跟进Ngtos.class.php的run函数
这里通过传入的参数module和action,加载对应的modules中的功能文件
看到这里大概知道了,此TopADS系统是如何正常运行,如何正常传参,如何操作各种功能了
剩下的就是审计功能文件了,都在modules文件夹下面了
0x001 任意用户密码重置
文件/modules/page/frame.mds.php
当action为change_password时,并没有判断$_SESSION['auth_id']),直接操作ngtos_mngt_password_modify($_POST['name'], $_POST['password'])
所以无需登录即可修改任意用户的密码了
0x002 命令执行
之前一个漏洞中提到过一个命令执行,这里我们拿出来不同的点
文件modules/ads/ads_report_upload.mds.php
可以看到,这里上传时,没有任何判断,上传后判断了文件类型及文件头,这里不做详细分析
当判断文件格式失败时,会把上传的文件删除掉,此时,将$_FILES['file']['name']拼接到命令中,进入system函数执行,导致命令执行
0x003 多处文件上传
第一处文件上传
文件modules/ads/ads_report_upload.mds.php
上传时没有任何判断,但是上传后进行了判断
跟进FileTypeValidation::validation
从这里可以看出,判断时,从上传的文件中读取文件头是不是等于jpg的头FFD8FF,如果相等就返回true,此时上传成功
那么我们上传一个php文件,然后加上jpg的头FFD8FF就ok了,成功上传文件
第二处文件上传
文件modules/ads/ads_staticwlist.php
直接上传,无任何过来
直接发送请求:
第三处文件上传
文件modules/ads/ads_staticblist.php
原理同第二处上传,无过滤,直接上传
直接发送第二处的请求即可上传成功,不在证明
0x004 文件删除
文件modules/ads/ads_ads_capture_tcpdump.php
当$post_submit_action == "adscapture_tcpdump_delete_pcap"时,直接拼接参数进行unlink
这里的$post_submit_action是前面我们分析入口是提到的$post_submit_action = $_POST['submit_post'];
所以那前面的的文件上传,删除上传的1.php为例,成功删除
0x005 文件读取
文件读取见http://**.**.**.**/bugs/wooyun-2010-0176586这个漏洞
0x006 SQL注入
SQL注入漏洞的原因在漏洞http://**.**.**.**/bugs/wooyun-2010-0176616这个漏洞中已经给出了一部分,还有很多,但是原因相同,都是make_where惹的祸
这里将$_POST的内容处理时,在最后的else条件中$sql_where .= "AND $key = '$POST[$key]' ";
直接将key带入sql语句,导致sql注入漏洞
之前的漏洞没有给出数据,厂商说不行,这里不上sqlmap的结果
全局搜索make_where(即可,因为用到此函数的,基本都存在sql注入问题
0x007 未授权访问
这里主要是从有两部分原因:
一个是直接没有走入口文件进入应用,直接访问的文件
二个是从入口进入应用了,但是没有进行$_SESSION['auth_id']判断,也是可以直接访问的