前言

被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

result2ContentArraygetPosts处被调用

我们通过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


"孓然一身 , 了无牵挂"