蝌蚪背上纹青蛙,你秀nm!
--古吉拉特邦永远的领袖 莫迪大仙
引言:学而不思则罔,思而不学则殆,不学不思则爽!阶段性做个总结(本来打算昨天写好,结果太懒了,淦!)
参考文章
CTFshow之RCE代码命令远程执行第29关到第40关详细讲解
CTFshow之RCE代码命令远程执行第41关到第52关详细讲解
一、命令执行
1、代表关卡:第29关、第30关
2、常用函数:
(1)system()函数
作用:调用shell来执行命令;返回命令的退出状态
(2)exec()函数(execl, execlp, execle, execv, execvp, execvpe)
作用:创建一个新的进程,并在新进程中执行命令
(3)其他:shell_exec()、passthru()
3、配合函数:eval(),执行括号内的代码
4、常用符号:通配符*和占位符?
5、反引号:`
被反引号包裹的内容当作内容进行执行
观察可知,此绕过实现必须存在可执行函数
二、参数逃逸
1、代表关卡:第29关至第36关
2、实现样式:?c=eval($_GET["p"]);&p=system("tac flag.php");
当过滤东西过多时,我们对c参数先传入$_GET,表示再从地址栏中接受p参数,从而在传递p参数时不再受之前过滤限制,从而达到过滤绕过的效果
观察可知,此绕过实现必须存在左右括号(),否则难以绕过
三、伪协议
1、代表关卡:第29关至第39关
2、常用协议:
执行前的要求:存在include语句,或者可以通过传递加入include语句
(1)data协议:
实现样式:?c=include$_GET[a]?>&a=data://text/plain,<?= system("tac flag.php")?>
注意:include语句并未加上()左右括号(绕过点+1)
上述三处标记处值得一提
首先,对于$_GET()和$_POST()进行传参时,字符可以不用强制加上单引号或者双引号
适用场景:单引号和双引号被过滤,0-9数字被过滤
其次,一条语句结束使用;进行隔离,可使用?>进行绕过
最后,对于php程序格式<?php ?>,php可以替换成=
(2)php协议
实现样式:c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
注意:使用php协议得到仅仅是base64编码后的flag值,需要进行解码
四、文件包含
1、代表关卡:第38关
2、实现思路:
关卡中存在include字样。由于过滤较为严格,无法直接获取flag,我们将flag文件通过cp命令复制为1.txt,再通过文件包含读取1.txt的内容
五、循环套娃
1、代表关卡:第40关
2、实现思路:
由于过滤内容遍布大江南北,不过最后留下了()括号和;分号,所以可以使用循环套娃。通过一层一层抽剥将flag拿出。
具体实现
CTFshow之RCE代码命令远程执行第29关到第40关详细讲解
六、异或运算、或运算
1、代表关卡:第41关
2、实现思路:
由于过滤内容为a-z字母和0-9数字,所以通过使用相关编码得到使用A-Z字母和相关特殊符号进行异或、或运算得到对应可执行的命令执行,继而绕过
具体实现
七、重定向吞噬
1、代表关卡:第42关至第52关
2、实现思路:
由于直接使用命令执行,执行内容会被吞噬所以使用;或者||多次执行绕过,需要显示的命令再;和||之前
3、实现样式:
?c=tac fla*||ls
?c=tac fla*;ls
4、查看命令:more tail less head sort sed cut awk strings od tac cat nl
linux存在多种查看文件的命令,当常见的cat、tac、more、less命令被过滤时,可以执行平替命令
八、空格过滤
1、代表关卡:第45关至第52关
2、替换形式:
$IFS$9,${IFS},$IFS,'',%09,<
注意:在nl(tac)命令中空格可以使用<进行代替
至此总结结束,有点水,不过将就着看看