DVWA的使用练习:
今天学习的内容很有意思,也很实用。
DVWA其实本质上就是一个脆弱系统,它需要的是php+mysql的环境,旨在为安全人员提供一个合法的环境用来测试自己的专业技能和工具,并且让web安全工作着深刻的理解漏洞防范和入侵的本质原理,很适合我们这种小白锻炼自己,好废话不多说。。。。。
首先DVWA环境安装:
在下载DVWA之前我们需要一个php+mysql的环境,apache+php+mysql的环境搭建就不过多赘述了,百度帖子就很多,同时这一套环境作为一个安全工作者来说也是必备的,我的环境在虚拟机里,懒到不行。。就直接用了phpstudy做了环境。
去http://www.dvwa.co.uk/下载dvwa的压缩包,将其解压到phpstudy中www文件夹下
然后去config文件下有一个config.inc.php.dist文件,将其后面的.dist删除,形成config.inc.php文件,之后打开更改你数据库的用户名和密码。
图中的地方默认账号密码都是root,更改为你自己MySQL的用户名和密码,之后运行127.0.0.1/DVWA/setup.php就出现了页面,
下面有一个Creat/Reset Datebase 点击后它就自动创建好了数据库,然后登陆,默认账号密码root/password。
以上环境就完全搭建好了,简单。
之后进行实践操作,今天我进行的是file upload 的实践,在这里说一下dvwa环境包含了十个常用模块:
1.Brute Force(暴力(破解))
2.Command Injection(命令行注入)
3.CSRF(跨站请求伪造)
4.File Inclusion(文件包含)
5.File Upload(文件上传)
6.Insecure CAPTCHA (不安全的验证码)
7.SQL Injection(SQL注入)
8.SQL Injection(Blind)(SQL盲注)
9.XSS(Reflected)(反射型跨站脚本)
10.XSS(Stored)(存储型跨站脚本)
同时平台设置了四个难度的等级,low,medium,high,impossible.同时你可以看他们的源代码,对于你的代码审计能力有很大的帮助,每一个等级的过滤机制,实现过程一目了然。
就拿upload(文件上传)来说,每一等级的过滤就很不一样。
首先我们来看low等级的源代码
<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Where are we going to be writing to?$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// Can we move the file to the upload folder?if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}
}?>
这段代码的核心就是验证是否有接收文件**($_POST[‘Upload’])然后组合文件根路径成为*target_path***就是目标路径。
$target_path = DVWA_WEB_PAGE_TO_ROOT.“hackable/uploads/”;
DVWA_WEB_PAGE_TO_ROOT=D:\phpstudy\WWW\DVWA
$target_path=D:\phpstudy\WWW\DVWA/hackable/uploads/
target_path = target_path . basename($_FILES[‘uploaded’][‘name’]);
因此最终你上传的文件的最终路径为:
$target_path=D:\phpstudy\WWW\DVWA/hackable/uploads/123.jpg
123.jpg就是你要上传的目标文件。
之后我们看到它对上传的文件没有任何的要求,文件类型或是文件大小都没有做规定,于是我们可以轻松的传我们的木马上去,这也果然是低等级的啊。
然后我们再看中等级:
File Upload Source
<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Where are we going to be writing to?$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// File information$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];// Is it an image?if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&( $uploaded_size < 100000 ) ) {// Can we move the file to the upload folder?if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}?>
我们看到中等级就相对严密了很多,它对文件的类型和大小做了明确的限制。
( uploaded_type == “image/jpeg” || uploaded_type == “image/png” ) &&
( $uploaded_size < 100000 )
限定了格式为image/jpeg或是png 大小小于100000字节的文件才能上传,而这个问题我们抓包就可以解决。
打开burpsuit, 我们拦一下上传包,改一下他的上传格式,绕过拦截。
然后我们发现上传成功,源文件里也确实上传成功了。
这种看似很规范的拦截其实也形同虚设,我们上传的木马等大小一般不会超过100000字节,而对文件类型的检查也仅仅看上传文件的提交属性,所以十分有机可乘。如果他能对文件头或者文件名验证更明确才会有些难度。
所以我们来看一下高级的难度,看看尝试可不可以绕过上传。
<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Where are we going to be writing to?$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// File information$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];// Is it an image?if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&( $uploaded_size < 100000 ) &&getimagesize( $uploaded_tmp ) ) {// Can we move the file to the upload folder?if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}?>
我们看到高级难度的验证就更严格了,它多了一句这个:
(($uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, ‘.’
) + 1);
他的作用是什么呢?
其实他是防范iis 6.0文件解析漏洞的,有时我们为了绕过限制会提交这样形式的文件:
Xx.asp;.xx.jpg xx.jpg
而这句话的作用就是说它会验证文件的最后一个点之后的格式上面的例子来说就是不管你前面写了多少,我只验证最后的 ’.jpg’。
strtolower( $uploaded_ext ) == “jpg” || strtolower( $uploaded_ext ) ==“jpeg” || strtolower( $uploaded_ext ) == “png”
同时这句话对上传文件的类型做了更明确的要求,只识别jpg 和 jpeg 的文件,这个就有些难度了,而我们只能尝试一下%00截断了。
%00在url语言里代表空格“ ”,因此它起到的作用就是截断文件的后半段,让它识别到的文件格式是.jpg,而解析时会是前面的脚本格式。我们试一下。
我上传了一个hedan.php.jpg文件然后进行%00截断。
仔细查看后发现%00截断需要PHP<5.3.4,实验环境为5.6.35所以无法利用。
所以只能换别的方法了;
我做了一张图片隐藏后门fun.jpg
用16进制编辑器010editor实现,文件上传。
上传后可以正常访问,而此时我们的难题就是怎么让文件被解析而触发我们的后门
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file://D:\phpstudy\WWW\DVWA\hackable\uploads\fun.jpg
发现文件被解析,下面我们菜刀连接就好了。