本文章可做DVWA普及课件所用
查看代码可知,代码中并没有任何防护手段,没有防爆破措施,比如验证码或者是错误登录限制措施,仅仅是设置login参数是否存在。
存在暴力破解和SQL注入。
演示自行使用BP以及自带字典。
比较代码看出,username和password参数都是经过一次mysql_real_escape_string
函数转换。查阅手册可知
这个只是减小了sql注入的可能性但是并不影响暴力破解
演示自行使用BP以及自带字典。
这个级别的代码加入了CSRF-Token机制,通过抓包可以看到比前面两个等级多了一个参数user_token
。查看提交页面,我们发现form表单里还存在一个hidden类型的参数。用户每次都要提交这个参数,服务器收到请求后会优先检查token是否匹配。
并且检查username和password参数时又加了一个函数:stripslashes
进行去除字符串中的反斜线,然后使用mysql_real_escape_string
进一步的防止SQL注入。
查看代码可知,使用可靠的登录次数和频繁登录将会锁定账户,以及在进行SQL查询时使用了预编译,预编译基本上已经杜绝了大部分SQL注入的可能性。
查看代码看到两个函数介绍一下:
代码逻辑判断就是ping4次,因为Linux系统默认时无限次数ping的。
演示见具体的操作。
这里需要注意的是”&&”与” &”的区别:
payload:127.0.0.1&;&ipconfig
详情见具体演示
Command 1 | Command 2。“|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。
explode
将一个字符串变成数组。
is_numeric
判断是否为数字。
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
见具体演示。
多了这么一行代码防止CSRF攻击
eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] )
,就是判断http包里的referer字段包含主机名。
payload:“将1.php改成xxxxxx.php(xxxx为被攻击服务器的主机名)”
把这两个放到一块,是因为high这个加入了token,预想情况也是在css中请求修改密码的页面,然后获取其token。但是问题来了,牵涉到了跨域问题,现在的市面上的浏览器是不允许进行跨域请求的。基本就在浏览器层次杜绝了csrf攻击,然后impossible层次中加入了需要原密码才能够修改。
指当服务器开启allow_url_include
选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen
选项(选项开启之后,服务器允许包含一个远程的文件)。
未作任何过滤,直接打就行
str_replace
函数就进行了一次,双写绕过直接打。
直接白名单了,没辙
无任何过滤,直接上马菜刀连。
基本操作,BP劫包然后改type
结合文件包含打组合拳
ext检测文件格式直接白名单格式锁死
因为在本地测试,无法fq去访问到Google的验证码。因此无法进行测试验证。
基本步骤:
判断是否存在注入,注入是字符型还是数字型
猜解SQL查询语句中的字段数
确定显示的字段顺序
获取当前数据库
获取数据库中的表
获取表中的字段名
下载数据
没有任何过滤,hackbar打开一把梭。
数字型注入,那么这个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级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
所以说手工永远是机器无法代替的基本功。
在代码逻辑中添加了一个limit 1
,但是使用注释符#就注释了,不会产生影响。
PDO预编译天下第一!!!
输入1’ and length(database())=1 #,显示不存在;
输入1’ and length(database())=2 #,显示不存在;
输入1’ and length(database())=3 #,显示不存在;
输入1’ and length(database())=4 #,显示存在:
输入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,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。
DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。
payload:
大小写混合绕过。
preg_replace()
函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
payload:
重点函数htmlspecialchars
在 HTML 中,某些字符是预留的。
在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。
如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。
原理上跟反射一样,只是将输入的payload存到了数据库里,还是一把梭没啥说的。