目录:
流量
<?php
error_reporting(0);
define('LOG_FILEDIR','./logs');
function waf(){
# it could be useful if you using nginx instead of apache
if(!function_exists('getallheaders')){
function getallheaders(){
foreach ($_SERVER as $name => $value){
if(substr($name,0,5) == 'HTTP_'){
# 这些替换应该是关于 nginx 弄得。apache中没这些情况
$headers[str_replace(' ','_',ucwords(strtolower(str_replace('_',' ',substr($name, 5)))))] = $value;
return $headers;
}
}
}
}
$get = $_GET;
$post = $_POST;
$cookie = $_COOKIE;
$header = getallheaders();
$files = $_FILES;
$ip = $_SERVER['REMOTE_ADDR'];
$method = $_SERVER['REQUEST_METHOD'];
$filepath = $_SERVER['SCRIPT_NAME']; # 上传路径
foreach ($_FILES as $key => $value){
# 这里还是补明白啊。
$files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
file_put_contents($_FILES[$key]['tmp_name'],"virink");
}
unset($header['Accept']); # 这里为什么要 unset 这个啊
$input = array("GET"=>$get,"Post"=>$post,"Cookie"=>$cookie,"File"=>$files,"Header"=>$header);
logging($input);
}
function logging($var){
$filename = $_SERVER['REMOTE_ADDR']; # 获取ip
$LOG_FILENAME = LOG_FILEDIR."/".$filename; # 用ip来当作文件名
$time = date("Y-m-d:i:s");
file_put_contents($LOG_FILENAME,"\r\n".$time."\r\n".print_r($var,true),FILE_APPEND);
file_put_contents($LOG_FILENAME,"\r\n".'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'],FILE_APPEND);
# 后面这两个$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] 可以用 $_SERVER['REQUEST_URI']来代替吧?
file_put_contents($LOG_FILENAME,"\r\n***************************************************************",FILE_APPEND);
}
waf();
?>
1.define
<?php
define("ADAM",'hello adam');
echo ADAM;
echo "\n";
echo constant('ADAM');
echo "\n";
echo constant("ADAM");
?>
这三个都行,都能输出。
2. function_exists
判断某个方法是否存在,解析php函数function_exists (),method_exists()与is_callable()的区别.。
3. getallheaders()
我比较了 getallheaders和 SERVER全局变量之间内容的关系,getallheaders()就比较全
3. waf()中的 foreach
前五位为 HTTP_。说的就应该是这些
https://www.cnblogs.com/panxiongfei/p/3482767.html
4. substr
当只有一个参数的时候,代表从第几位之后输出。
<?php
echo (substr("123456789",5));
# output:789
示例 #1 使用负数 start
<?php
$rest = substr("abcdef", -1); // 返回 "f"
$rest = substr("abcdef", -2); // 返回 "ef"
$rest = substr("abcdef", -3, 1); // 返回 "d"
?>
5.ucwords,变大写而已
6.$_FILES
使用$_FILES获取上传文件信息 (PHP)。里面有个上传文件的功能,可以自己写网站练习PHP的时候用一用
在本地实践一下:
test.php:
传到test1.php中,然后burp抓包,同时test1.php进行 var_dump()
<form enctype="multipart/form-data" action="test1.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
<input name="myFile" type="file">
<input type="submit" value="上传文件">
</form>
<?php
var_dump($_FILES['myFile']);
?>
test1.php:
<?php
var_dump($_FILES['myFile']);
?>
这是结果:test1.php页面显示出来的
array(5) {
["name"]=>
string(6) "aa.php"
["type"]=>
string(24) "application/octet-stream"
["tmp_name"]=>
string(46) "C:\Users\lenovo\AppData\Local\Temp\php637E.tmp"
["error"]=>
int(0)
["size"]=>
int(6)
}
7.$header[‘Accept’]
还记得不,有个命令执行的就是利用getallheaders()进行rce的
利用了一些函数,等可以去看看
$header = getallheaders();
var_dump(getallheaders()['Accept']);
返回结果是这个:
能够接收这些类型,但是 后面的什么意思就不知道了
这个是burp抓到的同一个包。
8.$_SERVER[‘REMOTE_ADDR’]
这个是不可伪造的,解析url的IP地址,也就是,如果可以伪造的话,也就只能够在路由那里进行伪造了,
有个题目,请看 班长出的内部赛那里
9.file_put_contents(,第三个参数)
10.print_r的第二个参数true
<?php
$a = array("asdf"=>"qewr","asqwer"=>"hfg");
$b = print_r($a);
echo "<br>"."above is print_r ,below is b"."<br>";
var_dump($b);
?>
结果如下:
执行 print_r() 。 然后返回值 为true。赋值给b
然后当 带上 参数 true 的时候
<?php
$a = array("asdf"=>"qewr","asqwer"=>"hfg");
$b = print_r($a,true);
echo "<br>"."above is print_r ,below is b"."<br>";
var_dump($b);
?>
上面空了,也就是说,print_r没有执行,但是返回值不是true了,
但而是 将 输出的值进行了返回
11. $_SERVER[‘HTTP_HOST’]
URL中网站的域名或者ip地址
了解这些就够了。
所以,在实际程序中,应尽量使用_SERVER[“HTTP_HOST”] ,比较保险和可靠。
12.$_SERVER[‘PHP_SELF’]
用于替换的这个,可以参考下面这个