渗透测试实战(一) | Sunbet
登录
  • 欢迎进入Sunbet!
  • 如果您觉得Sunbet对你有帮助,那么赶紧使用Ctrl+D 收藏Sunbet并分享出去吧
  • 您好,这里是Sunbet!

渗透测试实战(一)

Sunbet_安全预警 申博 136次浏览 已收录 0个评论

写在前面

准备分享一些实战向的、思路比较有趣的文章,算不上系列吧,只是不知道怎么命名好一些。

​ 工作中某迂回目标的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函数,简单的阅读代码,让我眼前一亮。

/**
*api.php
**/

渗透测试实战(一)

从代码中可以看出,文件后缀名路径皆可控,只要post $_FILES[\’snapshot\’][\’name\’]参数,以及正确的用户名密码即可上传任意文件。所以尝试直接,访问api.php文件,通过自己构造上传类型的数据包上传正常文件。

phpweb前台任意文件上传

测试环境:WindowsXP+PHPnow1.6.5+phpwebV2.0.35 在 base/appplus.php 文件中,我们发现一处未过滤的文件上传。但是要利用这处任意文件上传,我们得先绕过第15行的密钥校验。 全局搜索下 md5(strrev($dbUser.$dbPass)) ,看看有没办法将这个值 leak 出来。这里共搜出4处,而 base/post.php 文件中的代码明显和其他不一样,我们看其具体代码。 我们在 base/post.php 文件中,发现当 $act=”appcode” 时,程序就会将 md5(strrev($dbUser.$dbPass)) 输出,而 $act 完全可控。 那么攻击步骤就很清晰了。先利用 base/post.php 文件 leak 出 md5(strrev($dbUser.$dbPass)) 的值,然后再利用 base/appplus.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看能否找到更改后的代码。

.git还原问题

网络上的工具还原方式不同,导致还原的文件也不相同,推荐使用GitTools工具,还原的代码很全面,就是比较耗时。

GitTools,将所有commit还原后我找到了最新的config文件,发现了代码修改的部分。

config.php文件在/inc目录下。

渗透测试实战(一)

发现迁移到linux以后的代码验证了host,之前一直用ip:port访问并不能上传成功,修改host为beauty.xxxx.net(ip为.81),上传文件..-..-a.php成功。

渗透测试实战(一)

渗透测试实战(一)

写在后面

在构造上传包和文件名处是比较有趣的,同时自己也学到了一些东西。不知道为什么,当想尽办法绕过的时候觉得是个很有趣的点,回过头来写文章却发现平平无奇,由于项目暂停了也没法搞内网了,看了一下内网还是挺大的,linux代理进去搞一波可能会有收获,文章就到这里吧。

 


Sunbet|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明渗透测试实战(一)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址