抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

本文章可做DVWA普及课件所用

暴力破解

low

查看代码可知,代码中并没有任何防护手段,没有防爆破措施,比如验证码或者是错误登录限制措施,仅仅是设置login参数是否存在。
存在暴力破解和SQL注入

演示自行使用BP以及自带字典。

medium

比较代码看出,username和password参数都是经过一次mysql_real_escape_string函数转换。查阅手册可知,这个只是减小了sql注入的可能性但是并不影响暴力破解

演示自行使用BP以及自带字典。

high

这个级别的代码加入了CSRF-Token机制,通过抓包可以看到比前面两个等级多了一个参数user_token。查看提交页面,我们发现form表单里还存在一个hidden类型的参数。用户每次都要提交这个参数,服务器收到请求后会优先检查token是否匹配。

并且检查username和password参数时又加了一个函数:stripslashes进行去除字符串中的反斜线,然后使用mysql_real_escape_string进一步的防止SQL注入。

impossible

查看代码可知,使用可靠的登录次数和频繁登录将会锁定账户,以及在进行SQL查询时使用了预编译,预编译基本上已经杜绝了大部分SQL注入的可能性。

命令注入

low

查看代码看到两个函数介绍一下:


代码逻辑判断就是ping4次,因为Linux系统默认时无限次数ping的。

演示见具体的操作。

medium

这里需要注意的是”&&”与” &”的区别:

  • Command 1&&Command 2。先执行Command 1,执行成功后执行Command 2,否则不执行Command 2。
  • Command 1&Command 2。先执行Command 1,不管是否成功,都会执行Command 2

payload:127.0.0.1&;&ipconfig

详情见具体演示

high

Command 1 | Command 2。“|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。

impossible

explode将一个字符串变成数组。
is_numeric判断是否为数字。

CSRF

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。

low

见具体演示。

medium

多了这么一行代码防止CSRF攻击
eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ,就是判断http包里的referer字段包含主机名。

payload:“将1.php改成xxxxxx.php(xxxx为被攻击服务器的主机名)”

high && impossible

把这两个放到一块,是因为high这个加入了token,预想情况也是在css中请求修改密码的页面,然后获取其token。但是问题来了,牵涉到了跨域问题,现在的市面上的浏览器是不允许进行跨域请求的。基本就在浏览器层次杜绝了csrf攻击,然后impossible层次中加入了需要原密码才能够修改。

文件包含

指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。

low

未作任何过滤,直接打就行

medium

str_replace函数就进行了一次,双写绕过直接打。

high

出现了一个新函数

这个等级配合文件上传打组合拳。

impossible

直接白名单了,没辙

文件上传

low

无任何过滤,直接上马菜刀连。

medium

基本操作,BP劫包然后改type

high

结合文件包含打组合拳

impossible

ext检测文件格式直接白名单格式锁死

不安全的验证码

因为在本地测试,无法fq去访问到Google的验证码。因此无法进行测试验证。

SQL注入

基本步骤:

  1. 判断是否存在注入,注入是字符型还是数字型

  2. 猜解SQL查询语句中的字段数

  3. 确定显示的字段顺序

  4. 获取当前数据库

  5. 获取数据库中的表

  6. 获取表中的字段名

  7. 下载数据

low

没有任何过滤,hackbar打开一把梭。

medium

数字型注入,那么这个mysql_real_escape_string就基本失去了作用。
payload:

1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'

high

High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
所以说手工永远是机器无法代替的基本功。

在代码逻辑中添加了一个limit 1,但是使用注释符#就注释了,不会产生影响。

impossible

PDO预编译天下第一!!!

SQL盲注

1
2
3
4
5
6
7
输入1’ and length(database())=1 #,显示不存在;

输入1’ and length(database())=2 #,显示不存在;

输入1’ and length(database())=3 #,显示不存在;

输入1’ and length(database())=4 #,显示存在:
1
2
3
4
5
6
7
8
9
10
11
输入1’ and ascii(substr(databse(),1,1))>97 #,显示存在,说明数据库名的第一个字符的ascii值大于97(小写字母a的ascii值);

输入1’ and ascii(substr(databse(),1,1))<122 #,显示存在,说明数据库名的第一个字符的ascii值小于122(小写字母z的ascii值);

输入1’ and ascii(substr(databse(),1,1))<109 #,显示存在,说明数据库名的第一个字符的ascii值小于109(小写字母m的ascii值);

输入1’ and ascii(substr(databse(),1,1))<103 #,显示存在,说明数据库名的第一个字符的ascii值小于103(小写字母g的ascii值);

输入1’ and ascii(substr(databse(),1,1))<100 #,显示不存在,说明数据库名的第一个字符的ascii值不小于100(小写字母d的ascii值);

输入1’ and ascii(substr(databse(),1,1))>100 #,显示不存在,说明数据库名的第一个字符的ascii值不大于100(小写字母d的ascii值),所以数据库名的第一个字符的ascii值为100,即小写字母d。

以此类推即可。

XSS(反射)

XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。

DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。

low

payload:

1
<script>alert(/xss/)</script>

medium

大小写混合绕过。

high

preg_replace()函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
payload:

1
<img src=1 onerror=alert(/xss/)>

impossible

重点函数htmlspecialchars

在 HTML 中,某些字符是预留的。
在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。
如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。

XSS(存储)

原理上跟反射一样,只是将输入的payload存到了数据库里,还是一把梭没啥说的。

评论