ctfshow web29-38(命令执行)

温故而知新,复盘时尝试不同方法,弄懂原理!

29.

ctfshow web29-38(命令执行)_第1张图片

 审计代码,发现eval()函数,作用是将其中的内容当做php代码进行执行,再看条件,

!preg_match("/flag/i",$c),变量是c,不匹配大小写的flag就行,其正则表达式为:/flag/i,该函数表示从我们构造的ip的值中匹配flag字符串,

正则表达式中"/"是表达式开始和结束的标记(即匹配了flag)且其后的"i"标记这是一个大小写不敏感的搜索,即flag中字母的大写和小写的组合都会被匹配到

本题中的正则表达式未涉及许多的正则表达式的元字符,例如还有一些其他常见的类型题目如正则表达式(/^\w+$/)在表达式开始和结束的标记中间的

^匹配输入字行首;

\w 匹配包括下划线的任何单词字符;

+匹配前面的子表达式一次或多次(大于等于1次);

$匹配输入行尾

总体意义就是限定一个任意长字符串,全部由字母数字下划线组成,前面中间后面都不能有空格、标点等非\w字符

那flag通常在flag.php,flag.txt内,我们需要读取文件,常用命令nl,cat,tac,more,sort

cat  flag.php  ,  nl [选项]  flag.php,tac是cat的反向输出  tac flag.php,

more [选项]【flie】 more flag.php

sort [选项] flag.php

我们一般将代码执行漏洞转换为命令执行漏洞,常借助system()函数,''

再用通配符、拼接等方式绕过flag的屏蔽

fl''ag,  fla?.php,fla*

?c=system('cat fla*');  ?c=system('cat fla""g.php');  注意:;不能少,拼接的符号不要与括号内的相同,单引号配双引号。

还可以使用echo配合''(详)

cat不会显示,但是f12可以看到

ctfshow web29-38(命令执行)_第2张图片

 

30.

ctfshow web29-38(命令执行)_第3张图片

 多屏蔽了system,那么使用其他的php命令执行函数,可以用passthru($cmd),shell_exec($cmd)

?c=passthru('more fla*');

shell_exec()在此处似乎没用 ,反撇号//(shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体)

ctfshow web29-38(命令执行)_第4张图片

31.ctfshow web29-38(命令执行)_第5张图片

多屏蔽了cat、sort,单引号和空格,单引号换双引号,空格用TAB替换,TAB的URL编码是%09 

?c=passthru("more%09fla*");

无参数函数的写法(还不会)

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

32.ctfshow web29-38(命令执行)_第6张图片

括号都去了,只能考虑Php伪协议

?c=include$_GET[“url”]?>&url=php://filter/read=convert.base64- encode/resource=flag.php

过滤了分号,那么可以直接?>闭合php,因为php语法中,最后一句php代码可以不闭合(这里有一点要说一下,?>闭合的是eval里面的php语句,eval后续还有语句的话,依旧是会执行的);

这里实际是传了两个参数,第一个是c,受题目限制,但是c的实际内容是第二个参数Url的内容,url不受限制。

file:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访问 ftp URL
php:// 访问输入输出流
zlib:// 压缩流
data:// 数据
ssh2:// security shell2
expect:// 处理交互式的流
glob:// 查找匹配的文件路径

  • php://filter,作用:一种元封装器,设计用于数据流打开时的筛选过滤应用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。
  • resource=<要过滤的数据流>
  • read=<读链的过滤器>可以设定一个或多个过滤器的名称,以管道符分隔
  • convert.base64-encode属于转换过滤器,base64编码
  • /resource=文件名 读取文件源码
  • include属于文件包含函数,include$_GET[“url”] 等同于, $file=$_GET[“url”];
  • 造成文件包含的函数,除Include外,还有require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile

php伪协议详解看大佬:web安全——伪协议_ephemeral-fever的博客-CSDN博客_伪协议是什么

最后出来的是Base64编码的结果。

33.ctfshow web29-38(命令执行)_第7张图片

多屏蔽了双引号,写法同上,GET[]处可以不加引号,Include可以换require

?c=require$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php 

34.ctfshow web29-38(命令执行)_第8张图片

过滤了:号,但是并不影响第二个参数

因为?c=include$_GET[a]?>

35.ctfshow web29-38(命令执行)_第9张图片 

 多过滤了=和<,还是不影响

36.ctfshow web29-38(命令执行)_第10张图片

多过滤了数字,仍不影响

37. 

ctfshow web29-38(命令执行)_第11张图片

直接有include()函数,如果要执行只需要文件名即可,或者直接注入php代码

data需满足allow_url_fopenallow_url_include同时开启才能使用,使用如下:

file.php?file=data://text/plain,

 ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

data://text/plain协议

此协议需要在双on的情况下才能使用,很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入

38.

ctfshow web29-38(命令执行)_第12张图片

 增加了屏蔽字符串,但对data伪协议的base64编码无效,仍是上题方法

你可能感兴趣的:(ctfshow,正则表达式)