记录下自己写的经典Web漏洞靶场的write up,包括了大部分的经典Web漏洞实战场景,做个笔记。
0x01 任意文件下载漏洞
if(!empty($_GET['filename'])){ $filename = $_GET['filename']; $fileinfo = pathinfo($filename); header('Content-type: application/x-'.$fileinfo['extension']); header('Content-Disposition: attachment; filename='.$fileinfo['basename']); header('Content-Length: '.filesize($filename)); readfile($filename); exit(); }
这里对filename参数的值进行下载但是没有任何过滤,造成任意文件下载,如果要下载文件,我们可以使用绝对路径或者相对路径
以下载my.ini为例子
绝对路径:
相对路径:
0x02 任意文件读取漏洞
<?php if(isset($_GET['tpl'])){ echo "<pre>"; @readfile($_GET['tpl']); echo "</pre>"; } ?>
没做任何验证就读取文件。
http://www.hack_demo.com/hack_2.php?tpl=E:phpstudyMySQLmy.ini
0x03 任意文件删除漏洞(慎点~~)
这关是对传入删除函数的参数没有过滤,导致任意文件删除
<?php if(isset($_GET['filename'])){ $filename = addslashes($_GET['filename']);//没过滤. if(file_exists("file/".$filename))@unlink("file/".$filename); echo "<script>alert("文件删除成功!");location.reload();</script>"; } ?>
0x04 目录遍历漏洞
未对dir参数进行检查,直接显示dir参数指定的目录下的所有文件,造成目录遍历漏洞。
<?php header("Content-Type:text/html; charset=utf-8"); if (isset($_GET['dir'])){ //设置文件目录 $basedir=$_GET['dir']; }else{ $basedir = './file/'; } $auto = 1; checkdir($basedir); function checkdir($basedir){ if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..'){ if (!is_dir($basedir."/".$file)) { echo "文件名称: $basedir/$file "." <br>"; }else{ $dirname = $basedir."/".$file; checkdir($dirname); } } } closedir($dh); } } ?>
http://www.hack_demo.com/hack_4.php?dir=..
0x05 Cookie欺骗漏洞
这里只是判断cookie,cookie都是可以伪造的
这里只要$_COOKIE['user'] == md5($password)即可
<?php error_reporting(0); header("Content-Type:text/html; charset=utf-8");
$password = 'adminadmin'; if($_COOKIE['user'] == md5($password)) { ob_start(); echo "您回来啦管理员!"; ob_end_flush(); }else{ $cookietime = time() + 24 * 3600; $passt = 'user'; setcookie('user',md5($passt),$cookietime); echo "您不是管理员!"; } ?>
0x06 URl跳转漏洞
这里对跳转的地址没有任何过滤,导致任意url跳转
<?php $url=$_GET['jumpto']; header("Location: $url"); ?>
0x07 任意密码修改漏洞
http://www.hack_demo.com/hack_7.php
说白了 就是修改密码的时候判断用户标识太简单,比如这里修改密码的时候只是判断提交的id值,然后根据提交的id值去修改数据库中对应id的用户的密码。
<?php $Id = isset($_POST['Id'])?$_POST['Id']:''; $sql = "update `user` set `password`= '$password' where Id = '$Id'"; ?>
这里修改密码 ,我们填入了然后抓包
id改为1 放包