与其抱怨自己,不如埋怨他人。
--莫迪大仙
引言:今天来到ctf赛题RCE专题第二天(今天肯定写不完了啊啊啊啊啊),不过继续加油!
一、实验准备
1、ctf网址
2、firefox浏览器、hackbar插件
二、实验过程
(一)、第41关 代码审计
简单代码审计过后,整个人都不对了。你小子直接把数字和小写字母全部过滤了,而且ctf基本都是linux服务器区分大小写,并且过滤$和&符号,使得参数逃逸变成幻想,所以这咋玩?不过,主角总是最后出现,使用异或、或运算!
由于这一关我觉得十分有必要单独出一期仔细讲讲,所以参考以下文章。
CTFshow之RCE代码命令远程执行第41关超详细讲解。保教包会,不会可私信!-CSDN博客
(二)、第42关 代码审计和重定向文件
简单代码审计过后,发现出现了>dev/null 2>&1,啥意思?就是说我们将变量c传入后system执行的命令结果不再显示,而是被“吞掉”!所以此时我们即使可以传入命令执行代码,但是结果无法显示
不过,我们可以使用;和||进行构造绕过,骗一手,使得;和||前的命令执行输出,之后的命令执行结果被“吞掉”。
||表示前面的命令执行成功则后面的命令不执行,否则执行后面的命令
payload1:
?c=tac fla*;
payload2:
?c=tac fla*||
(三)、第43关 代码审计和重定向文件
简单代码审计后发现在上一关的基础上增加了对参数c的过滤,;、cat被过滤了,我们依旧可以延续上一关的思路
通过使用tac命令直接读取文件内容,||用于绕过被“吞噬”
payload:
?c=tac flag.php||
(四)、第44关 代码审计和重定向文件
简单代码设计后在之前的逻辑上过滤了flag,所以我们使用通配符*或占位符?进行绕过即可
payload:
?c=tac fla?.php||
(五)、第45关 代码审计和重定向文件
简单代码审计过后发现此关在上一关的基础上过滤了空格,不过是些许过滤罢了
过滤内容:
; cat flag 空格
我们使用$IFS($符号表示取linux环境下的变量)IFS代替空格,三种书写方式都可以:$IFS$9,${IFS},$IFS。那么什么是IFS呢?
Linux下存在一个特殊的环境变量叫做IFS,即内部字段分隔符 (internal field separator).
1、?cmd=ls$IFS-l //此时执行ls -l命令可以绕过空格过滤
2、单纯$IFS2,IFS2被bash解释器当做变量名,输不出来结果,加一个0就固定了变量名
?cmd=ls${IFS}-l
3、$IFS$9后面加上${}类似,起截断作用;$9表示当前系统shell进程第九个参数持有者,并且值始终为空字符串
payload:
?c=tac${IFS}fla*.php||
(六)、第46关 代码审计和重定向文件
简单审计过后,过滤字符为:
; cat flag 空格 0-9整数 $ *
相较于上一关过滤内容多了0-9整数 $ *,对比我们上一关的payload,通配符*和$无法再使用,所以无法进行白嫖
再想想还有什么可以打破空格束缚?%09表示Tab键,可以一试
payload:
?c=tac%09fla?.php||
(七)、第47关 代码审计和重定向文件
简单审计过后,发现过滤内容为:
; cat flag 空格 0-9整数 $ * more tail less head sort
分析过后发现仅仅是多过滤了linux中读取文件的命令函数,白嫖上一关的payload
payload:
?c=tac%09fla?.php||
(八)、第48关 代码审计和重定向文件
简单审计过后,过滤内容为:
; cat flag 空格 0-9整数 $ * more tail less head sort sed cut awk strings od curl `(反引号)
对比上一关依旧添加了许多文本处理的Linux命令操作,依旧没有伤到我们的大动脉,继续白嫖!
payload:
?c=tac%09fla?.php||
(九)、第49关 代码审计和重定向文件
简单代码审计过后,过滤字符为:
; cat flag 空格 0-9整数 $ * more tail less head sort sed cut awk strings od curl `(反引号) %
终于,常在河边走,那有不湿鞋,%被“禁了”!但是我们仍然可以使用%09(TAB键)进行绕过。但是此时会有同学疑惑了,%不是被过滤了吗,咋过的??好问题!参考下述文章
CTFshow之RCE代码命令远程执行第49关详细讲解。可私信!-CSDN博客
payload:
?c=tac%09fla?.php||
(十)、第50关 代码审计和重定向文件
简单代码审计后,过滤内容:
; cat flag 空格 0-9整数 $ * more tail less head sort sed cut awk strings od curl `(反引号) % x09 x26
将我们的制表符tab过滤了(x09是tab十六进行表达式),所以换一种办法,使用我们的nl命令
构造payload时,关注四个点
1、nl命令可以用于读取文件
2、nl命令后面接文件名时需要跟上空格,但是空格被过滤了,所以可以使用<进行替代
3、由于flag被过滤,所以我们使用f''lag形式进行绕过,''表示为空,但是在执行命令时不被考虑
4、nl命令输出内容需要通过右键查看源码得到
payload:
c=nl<f''lag.php||
(c=tac<f""lag.php同样可以绕过)
(十一)、第51关 代码审计和重定向文件
简单代码审计后,过滤内容为:
; cat flag 空格 0-9整数 $ * more tail less head sort sed cut awk strings od curl `(反引号) % tac
过滤内容多了tac,不过我们已经不在需要tac进行读取,白嫖上一关即可
payload:
?c=nl<fl''ag.php||
轻松绕过!
(十二)、第52关 代码审计和重定向文件
简单代码审计后,过滤内容:
; cat flag 空格 0-9整数 * more tail less head sort sed cut awk strings od curl `(反引号) % tac > <
好家伙,把<也给过滤了,咋个办捏??但是$符号又被放出来了,真实顾此失彼呀!我们之前使用<就是因为空格和$都被过滤,现在好了,直接开历史的倒车!
payload:
?c=nl${IFS}fla%27%27g.php||
%27是单引号'的URL编码
但是,一查看发现目录不对,淦!开始查看目录所在位置
payload:
?c=nl${IFS}../../../fl''ag||
跑了好几个目录还是被我找到了!!
至此全部完成!