绕过方法有很多,这里只是讲几种我知道的方法,本人也是菜鸟一枚,写的不正确的地方欢迎大佬纠正,本篇博客也是为了记录一下自己踩到的坑,记录自己成长的点滴,以后方便查看,同时也希望能够帮到各位朋友,感谢!
蚁剑或中国菜刀都可以
先看源码:
<?php
if( 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 ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>
$target_path这个变量就是获取上传文件路径,move_uploaded_file函数移动文件上传位置,文件上传的时候会存到放临时目录,当脚本运行结束后就会销毁,所以要更改存放目录,可以看到,这个等级的上传完全没有限制,所以随便上传一个php木马就可以连接。
源码:
<?php
if( 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 ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>
可以看到,这个等级中用**_FILES**函数获取了文件名、类型和文件大小,(_FILES函数相关问题请自行百度),而且还需要上传的文件为jpeg或者png且文件大小小于100000字节才可以成功上传。有三种方法可以绕过:
修改Content-Type字段为image/jpeg可以看到成功上传:
使用蚁剑连接成功:
让3.jpg改为3.php同样可以绕过
得到文件路径,蚁剑连接即可。
可以看到对应的文件名所在行的16进制.jpg小数点所对应的16进制字符为2e,修改为00即可:
阿帕奇服务器上传机制默认为读取小数点后三位,所以上传上去后刚好为muma.php,同样可以使用蚁剑连接。
命令行使用copy 文件1/b + 文件2/a 生成文件名 例:copy 1.jpg/b + 1.php muma.jpg使用jpg文件和php文件合成为jpg文件,同样可以上传绕过,方法都差不多,这里不再上图(这个方法是按照书上写的,我试验的时候并没有成功,在下面high等级会讲到原因)。
放源码:
<?php
if( 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 ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>
这个等级个人觉得最主要的是getimage函数,这个函数大致就是获取上传文件内容,因为要检查内容所以相比medium等级来说要难很多,代码中主要函数作用:
strrpos(string , find ,start) 查找find字符在string字符中的最后一次出现的位置,start参数可选,表示指定从哪里开始 substr(string,start,length) 返回string字符中从start开始的字符串,length参数可选,表示返回字符的长度 strtolower(string) 返回给定字符串的小写 getimagesize(string) :函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING级的错误。所以 getimagesize函数的作用是判断上传的文件是不是有效的图片
绕过方法: 使用medium等级的合成木马,但是合成的木马的图片文件要尽可能小,我就因为这个坑困惑了很久,今天才让大佬帮忙解决,因为php一句话木马在文件末尾,但是解析出来的图片码部分代码会让浏览器误判为php语句,所以就提前执行导致报错,造成php语句解析不了的问题。但是如果木马写的太前面getimagesize函数就会识别出来,所以可以在BurpSuite中使用Repeater功能在合适的地方放置木马(一点一点的试),到最后也能成功上传。