准备分享一些实战向的、思路比较有趣的文章,算不上系列吧,只是不知道怎么命名好一些。
工作中某迂回目标的c段服务器,由于各种原因需要迂回战术去搞,所以遇到了文中的站点。对于上传点的利用过程感觉比较有意思,所以准备分享出来当作各位茶余饭后的休闲文章。
注: 由于不可抗拒因素,站点相关图片可能较少,分析过程尽可能详细一些。
工作以后,很多时候目标可能只有一个登录框,通常都很头疼。其实常规的手段都尝试一下,深入理解功能点、接口、数据传输形式等等,还是有可能突破的。希望在准备的一些实战总结文章中可以给各位提供一些思路。
通过c段端口扫描发现 .81这台机器开放82端口,服务为http。访问后为xx文档系统登录页面,需要认证登录,无验证码。因此可以考虑弱口令爆破、测试SQL注入、目录扫描、查看js/抓包寻找接口等等。
经过测试存在注入,并且目录扫描扫到了.git。我似乎已经看到了root权限,但是在进一步漏洞利用的过程中的的确确遇到了一些有意思的问题。
毫无过滤的注入,让我直接放弃了去看代码的想法,准备好了黑盒注入+上传一条龙。
经过简单的判断为盲注,但是当注入语句未闭合时会返回详细的mysql报错信息,返回的语句单引号经过转义,所以无法利用报错注入。直接用sqlmap跑就好了,发现非root用户,挂在vps去跑表和字段,准备找一个账号密码登录进去看看。
同时利用lijiejie的.git泄露exploit脚本,将源码下载了回来。
找到了登录 认证出的代码,发现在未闭合sql语句返回错误处可以利用,利用错误日志功能达到回显注入的目的。
通过测试发现$row['usr_id']内容为post的username参数值,将错误语句写入日志,再通过getErrorMsg函数select读取出来,导致了可以利用该功能进行回显注入,直接利用sqlmap跑出来的表名字段名读取了用户密码。
登录到系统后很快就找到了上传点,管理文档处可以上传pdf文件,但是只是单纯的前端校验。上传php文件后访问却404,观察url发现上传的文件名被写入数据库,通过参数调用的方式来加载文件(url:project.php?fn=1.pdf&file=1.php),这种形式的调用文件通常会将文件放在非web应用程序目录,而且就算放在了web目录由于没有返回路径也无法直接访问。
但是我们有源代码,这下shell没跑了吧?
此时遇到了个严重的问题,登录后的默认文件project.php,在我利用lijiejie脚本还原的文件里并不存在??
这种情况其实很常见,网上有很多.git泄露利用工具,但是每种还原的都不相同。暂时没有考虑还原全部commit,通过全局搜索危险函数,准备用最便捷的方式getshell。只找到了move_uploaded_file函数,简单的阅读代码,让我眼前一亮。
从代码中可以看出,文件后缀名路径皆可控,只要post $_FILES[\'snapshot\'][\'name\']参数,以及正确的用户名密码即可上传任意文件。所以尝试直接,访问api.php文件,通过自己构造上传类型的数据包上传正常文件。
的确执行了上传的操作,通过响应body中的 2 可以知道上传失败了,根据报错信息查看了config文件,发现出大问题。
define( 'PATH_ROOT', 'c:/wamp/www/webname' ); /* ...... */ define( 'PATH_UPL_PA', PATH_ROOT . '/files/pa' );
下载回来的配置文件中的绝对路径是windows目录,然而此时的web运行在linux上。这个运维直接将windows下的web程序迁移到了linux中。。。。 TQL
仔细下面这段代码,发现很有意思。
最直观的想法是,利用../可以控制上传目录,并且文件名可控,完全可以利用下面构造的文件名直接上传至根目录。那么可不可以利用目录跳转跳过定义的c盘目录,拼接前面爆出的此时linux的绝对路径。
../-../-../../../../../../../webpath/a.php
发现同样是失败的,后来经过同事提醒发现并不可以,因为在linux中无法跳过并不存在的目录。
同事在测的时候发现还有一个问题就是,../在php上传文件的时候反斜线后面就会被截断,也就是说根本不能通过../这样的形式进行目录跳转。
如果该api在迁移后仍在用,可以利用“..-..-a.php”文件名跳转绕过目录的限制(使用该文件名上传了一次发现依旧返回为2)。为了确认api还在使用,尝试还原所有commit看能否找到更改后的代码。
网络上的工具还原方式不同,导致还原的文件也不相同,推荐使用GitTools工具,还原的代码很全面,就是比较耗时。
GitTools,将所有commit还原后我找到了最新的config文件,发现了代码修改的部分。
config.php文件在/inc目录下。
发现迁移到linux以后的代码验证了host,之前一直用ip:port访问并不能上传成功,修改host为beauty.xxxx.net(ip为.81),上传文件..-..-a.php成功。
在构造上传包和文件名处是比较有趣的,同时自己也学到了一些东西。不知道为什么,当想尽办法绕过的时候觉得是个很有趣的点,回过头来写文章却发现平平无奇,由于项目暂停了也没法搞内网了,看了一下内网还是挺大的,linux代理进去搞一波可能会有收获,文章就到这里吧。