前言
登录某个网站并浏览其页面时,注意到了一些看起来不太对劲的地方。这些迹象可能是该网站存在漏洞或被黑客入侵的标志。为了确保这个网站的安全性,需要进行代码审计,这是一项专门针对软件代码进行检查和分析的技术。在本文中,我们将深入探讨代码审计的重要性和如何进行有效的代码审计。
1.目录遍历漏洞
进入模板功能-模板管理功能处。
发现此处的功能点可以遍历目录下的文件,接下来我们抓包查看当前功能点的代码。
![](https://img.haomeiwen.com/i26598771/6edf32b3df26daf3.png)
通过路由找到对应的文件 template.php ,然后接着通过 mudi=manage 进行分支选择进入到对应的函数中。
![](https://img.haomeiwen.com/i26598771/f46bcd4878b7e3d5.png)
进入template.php文件。
![](https://img.haomeiwen.com/i26598771/74b86064257f571a.png)
在 manage() 函数中,首先传入了两个参数, dirStr 参数则是控制路径的参数,而 sel 参数则是控制是否进入代码的if,而最后将路径传入到File类下的 GetDirList() 函数中。跟进GetDirList() 函数
![](https://img.haomeiwen.com/i26598771/c1948180176b3e98.png)
发现使用 opendir() 函数列出目录下的文件
![](https://img.haomeiwen.com/i26598771/3d4d6476850e96c3.png)
漏洞复现:
进入模板管理功能处,然后进行抓包。
![](https://img.haomeiwen.com/i26598771/00b7ce83b82fc2ba.png)
抓包之后,进行测试。
![](https://img.haomeiwen.com/i26598771/3409e4a177b7959d.png)
然后在dirStr使用.../../来测试目录穿越。
![](https://img.haomeiwen.com/i26598771/4461ce7bfd1ee715.png)
2.任意文件读取漏洞
全局fread() 函数,发现Read()函数中调用了 fread() 函数。
![](https://img.haomeiwen.com/i26598771/15ab73d73c17d815.png)
然后搜索 Read() 函数的调用情况。
![](https://img.haomeiwen.com/i26598771/7e552b4173b7f254.png)
进入classFile.php文件。
![](https://img.haomeiwen.com/i26598771/128cb1c4b90ded7b.png)
然后搜索fread()函数的用法。
![](https://img.haomeiwen.com/i26598771/432b73898e0e57b7.png)
发现在 sysCheckFile_deal.php 文件中调用了 File::read() 函数,跟进该函数。
![](https://img.haomeiwen.com/i26598771/fd709302eae9e6f2.png)
漏洞复现:
根据路由,去构造url路径,然后访问。
![](https://img.haomeiwen.com/i26598771/6048b40d1607ddf0.png)
接着抓包,配合../进行目录穿越读取文件。
![](https://img.haomeiwen.com/i26598771/100f2f43987c794f.png)
3.任意文件删除漏洞
在测试模板管理功能点处,发现该处存在一个删除的功能点,发现存在任意文件删除漏洞。
![](https://img.haomeiwen.com/i26598771/c8dd0c2f953f22ad.png)
首先我们通过路由找对相应的源代码 template_deal.php 文件,且这里的路由指向为 DelFile() 函数,该函数中接收了三个参数,其中filePath参数为主要控制路径的参数,将filePath参数带入到File::Del()中进行删除。跟进 del() 函数
![](https://img.haomeiwen.com/i26598771/9fff32ae9419ed2e.png)
![](https://img.haomeiwen.com/i26598771/753bd09021ad1a52.png)
该函数很简单,首先判断路径是否为空,不为空修改权限最后进行文件的删除操作。
![](https://img.haomeiwen.com/i26598771/d7eba28a0ee971cc.png)
漏洞复现:
进入功能点处。然后点击X号。
![](https://img.haomeiwen.com/i26598771/a67904b67ebc6bda.png)
然后在根路径写入一个xxx.txt文件。
![](https://img.haomeiwen.com/i26598771/91594fbcc82a820d.png)
然后在filepath参数后配合../来删除文件。
![](https://img.haomeiwen.com/i26598771/0cdb706a5cf2b452.png)
4.msql_getshell
在 黑盒 测试中中存在一个 SQL语句调试 的功能点,该处没有对SQL语句关键字的过滤而造成SQL语句的任意执行,导致getshell。
进入功能点处。
![](https://img.haomeiwen.com/i26598771/63a64cae71ca3def.png)
然后执行简单的SQL语句进行测试。
![](https://img.haomeiwen.com/i26598771/c9b1b2a7ac4aabda.png)
然后使用抓包工具来定位路由。
![](https://img.haomeiwen.com/i26598771/aa94074563fb46b5.png)
然后看一下代码,发现文件的开头以条件分支来选择对应要执行的功能点,由于上述 mudi=sql ,所以我们找到该处要执行的sql所对应的函数
![](https://img.haomeiwen.com/i26598771/91f324bd71a4d953.png)
![](https://img.haomeiwen.com/i26598771/c42d82f48f5e7fe9.png)
通过 OT::PostStr 方法传入五个参数,其中 sqlContent 中是需要传入的SQL语句,而下面对
into_outfile 、 global general_log 等SQL关键字进行了过滤
![](https://img.haomeiwen.com/i26598771/9b99decac312df5d.png)
![](https://img.haomeiwen.com/i26598771/725046b5874ed275.png)
在下面检测你填入的后台密码是否正确,如果正确继续执行下面代码,在代码中执行了我们输入
的SQL语句。未对其进行过滤完全,导致我们可以绕过过滤,来执行SQL语句。
![](https://img.haomeiwen.com/i26598771/1ca314d9c417050b.png)
漏洞复现:
首先去开启数据库日志功能,发现有过滤。
![](https://img.haomeiwen.com/i26598771/639d584bbd04c0af.png)
然后我们构造payload成功绕过过滤。
![](https://img.haomeiwen.com/i26598771/27452e0ba0506243.png)
然后我们写入phpinfp文件。
![](https://img.haomeiwen.com/i26598771/0170ae9ad46b1e1a.png)
构造payload,成功写入。
![](https://img.haomeiwen.com/i26598771/74f070e4e6034a17.png)
访问之后,成功getshell。
![](https://img.haomeiwen.com/i26598771/74c8db81afec0f01.png)
5.xss漏洞
进入users_deal.php
![](https://img.haomeiwen.com/i26598771/19dbbfadcc0e6df8.png)
检测type是否为数组中的固定值,不是则带入AlertEnd方法中
跟进AlertEnd方法
![](https://img.haomeiwen.com/i26598771/5a856319c7d3770b.png)
发现type被带<script>标签,使用AlertFilter函数处理后直接alert,跟进AlertFilter函数
![](https://img.haomeiwen.com/i26598771/991656488d3a8163.png)
漏洞复现:
构造payload,成功实现弹窗。
![](https://img.haomeiwen.com/i26598771/d10e12f7d372fcca.png)
6.xss漏洞2
进入read.php
![](https://img.haomeiwen.com/i26598771/400f0c7c9be9295c.png)
发现在GetCityData函数中,idName参数没有做任何处理,带入GetCituOptionJs函数中跟进该方法
![](https://img.haomeiwen.com/i26598771/35708ee02478e072.png)
该方法中idName参数被直接带入DOM方法中输出
![](https://img.haomeiwen.com/i26598771/b22223c9af676069.png)
漏洞复现:
要调用GetCityData函数需mudi参数,然后在idName处输入XSS的payload。
成功实现弹框。
![](https://img.haomeiwen.com/i26598771/bd700c7268b54193.png)
7.ssrf漏洞
在浏览代码过程中,发现该处使用curl_exec()函数来执行命令。
在函数UseCurl中,调用curl_exec函数执行了一个curl会话,只有$url参数可控,即可造成ssrf漏洞
![](https://img.haomeiwen.com/i26598771/cfa2f35c49f6ccff.png)
进入info_deal.php
![](https://img.haomeiwen.com/i26598771/db704a7970966f97.png)
跟进AddOrRev函数
![](https://img.haomeiwen.com/i26598771/63b0cc55b2224b3e.png)
接着跟进PostStr函数,发现其调用了post函数。
![](https://img.haomeiwen.com/i26598771/3ecfe2df8f2eb346.png)
跟进post函数。
![](https://img.haomeiwen.com/i26598771/e2a950db20ed9a83.png)
$img参数通过POST方式传入,并且无过滤措施
继续跟进SaveRemoteFile函数
![](https://img.haomeiwen.com/i26598771/c2f6b0fc350b9e39.png)
第二个参数被带入GetUrlContent函数,跟进GetUrlContent函数
![](https://img.haomeiwen.com/i26598771/5d35291033d161f6.png)
根据可控参数的带入,跟进UseAuto函数,并且此处传入3个参数 0,GET,$url
![](https://img.haomeiwen.com/i26598771/3ee5bf63ab17f2e0.png)
根据传入第一个参数$seMode为0,会调用UseCurl函数,即进入漏洞关键函数
目前已知漏洞触发链条,接下来只需要根据进入函数的条件,构造poc即可
首先需要进入AddOrRev函数,只需$mudi值为add
![](https://img.haomeiwen.com/i26598771/279fb97edd5c118b.png)
然后需要满足进入SaveRemoteFile函数的条件
![](https://img.haomeiwen.com/i26598771/566953967898bd45.png)
![](https://img.haomeiwen.com/i26598771/17abd117e7114ead.png)
发现输入的参数为http://,接着来复现漏洞。
![](https://img.haomeiwen.com/i26598771/15bdbb1db8d2e23e.png)
漏洞复现:
访问url地址,使用post方式,在img参数后面输入dnslog地址。
![](https://img.haomeiwen.com/i26598771/1964324b407d9ba1.png)
成功收到监听。
![](https://img.haomeiwen.com/i26598771/c116441d901ddd8f.png)
总结
代码审计可以帮助发现各种类型的漏洞。这些漏洞可能包括输入验证问题、授权问题、会话管理问题、跨站点脚本漏洞、SQL注入漏洞等。
![](https://img.haomeiwen.com/i26598771/dfc1494427ff4bcf.png)
网友评论