
【AWD附件】脚本学习 ------ PHP监控流量脚本 +++学习解释
发布日期:2021-05-08 04:03:34
浏览次数:30
分类:原创文章
本文共 3654 字,大约阅读时间需要 12 分钟。
目录:
流量
<?phperror_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
<?phpdefine("ADAM",'hello adam');echo ADAM;echo "\n";echo constant('ADAM');echo "\n";echo constant("ADAM");?>
这三个都行,都能输出。
2. function_exists
.。
3. getallheaders()
我比较了 getallheaders和 SERVER全局变量之间内容的关系,getallheaders()就比较全
3. waf()中的 foreach
前五位为 HTTP_。说的就应该是这些
4. substr
当只有一个参数的时候,代表从第几位之后输出。
<?phpecho (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
。里面有个上传文件的功能,可以自己写网站练习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> <?phpvar_dump($_FILES['myFile']);?>
test1.php:
<?phpvar_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’]
用于替换的这个,可以参考下面这个
13. $_SERVER[‘QUERY_STRING’]
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月26日 07时40分56秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
oracle 11g not in 与not exists 那个高效?
2019-03-06
Linux 安装Redis 5.0(以及参数调优)
2019-03-06
html5 Game开发系列文章之 零[开篇]
2019-03-06
为什么阿里巴巴建议集合初始化时,指定集合容量大小
2019-03-06
为什么阿里巴巴要求谨慎使用ArrayList中的subList方法
2019-03-06
Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?
2019-03-06
基于Python的Appium环境搭建合集
2019-03-06
Requests实践详解
2019-03-06
接口测试简介
2019-03-06
Golang Web入门(4):如何设计API
2019-03-06
让sublime实现js控制台(前提是安装了nodejs)
2019-03-06
树莓派连接二手液晶屏小记
2019-03-06
error: 'LOG_TAG' macro redefined
2019-03-06
android10Binder(一)servicemanager启动流程
2019-03-06
ES6基础之——new Set
2019-03-06
nodeJS实现识别验证码(tesseract-ocr+GraphicsMagick)
2019-03-06
玩玩小爬虫——试搭小架构
2019-03-06
AS与.net的交互——加载web上的xml
2019-03-06
Javascript之旅——第八站:说说instanceof踩了一个坑
2019-03-06