赞
踩
暴力破解的成功概率,一方面取决于被攻击系统是否有防暴力破解机制,防暴力破解机制是否高效,另一方面取决于攻击者的字典以及计算机性能。
这个模式会使用单一的payload组。它会针对变量位置设置payload。例如:
(1)添加了一个参数的话,并且假设payload有500个的话,那就执行500次。
(2)添加了两个参数的话,就会挨着来,第一个参数开始爆破时,第二个不变。如此这样,会进行500+500次,总共1000次爆破。
和狙击手差不多,一个参数的话都一样,只不过如果添加了两个参数的话,就使用同样的payload一起进行爆破。总共会进行500次爆破。
相比于Battering ram模式,Pitchfork的两个payload可以使用不同的字典。
Cluster bomb不仅可以设置多个参数,而且在爆破一个参数的时候,其他参数都会固定。
(1)首先观察页面,发现只要输入的用户名或者密码有一个错误,就回显“Username and/or password incorrect.”,多次输错密码,也没有提示用户被锁定不准继续尝试登录。因此,这关大概率没有防暴力破解机制。
(2)抓包
→
\rightarrow
→"send to intruder"
→
\rightarrow
→设置变量"usename"和"pawword",并选择"Cluster bomb"模式。
(3)点击"stack",根据"length"查看响应包。
几个函数:
mysql_query()
函数:执行某个针对数据库的查询。die()
函数:输出一条消息,并退出当前脚本。mysql_num_rows()
函数:返回结果集中行的数量,就是看有几行结果。mysql_result()
函数:返回 MySQL 结果集中一个单元的内容。 代码将获取用户输入的用户名和密码并将其进行 md5 加密,然后使用 SQL SELECT
语句进行查询。由于进行了 md5 加密,因此直接阻止了 SQL 注入,因为经过 md5 这种摘要算法之后 SQL 语句就会被破坏。
注意到此时服务器只是使用了
isset()
函数验证了参数 Login 是否被设置,参数 username、password 没有做任何过滤,更重要的是没有任何的防爆破机制。
(1)首先还是观察页面。medium和low大致是一样的,只要输入的用户名或者密码有一个错误,就回显“Username and/or password incorrect.”,并且多次输入错误的用户名和密码,也没有提示用户被锁定不准继续尝试登录。
唯一不同的是,medium关卡输错用户名密码之后,会延迟一段时间再返回登录失败的结果。应该是服务器端做了登录失败情况下的sleep操作,企图通过延时降低暴力破解的效率。
(2)这关的通关方法和Low关一模一样,就是慢点,这里就不再赘述了。
几个函数:
mysql_real_escape_string()
函数:转义在 SQL 语句中使用的字符串中的特殊字符,如\x00
、\n
、\r
、\
、'
、"
和 \x1a
。Medium 级别的代码主要增加了
mysql_real_escape_string
函数,该函数会对字符串中的特殊符号进行转义,从而对用户输入的参数进行了简单的过滤。而且,当登录验证失败时界面将冻结 2 秒,从而影响了爆破操作的效率。
(1)随便输入用户名和密码,然后抓包,发现登陆时有token。
(2)遇到token,有三招:
第一招,删除token后发包,不行。
第二招,重放,也不行。
第三招,使用burp得插件CSRF Token Tracker
。在extensions
中找到CSRF Token Tracker
,并安装。
勾选extension loaded
Host
就是请求包里面的那个host,Name
指的是你要抓取返回页面中哪个标签的name属性。
使用CSRF Token Tracker
插件的原理:你提交用户名密码后,burp捕获这个数据包,然后你将这个数据包send to repeater
,send
发送给服务端,服务端发送响应包, CSRF Token Tracker
插件捕获响应包中的user_token
。大概意思是这样的。
(3)进行爆破。
注意:抓到数据包后,直接send to intruder
,CSRF Token Tracker
插件会自动从第一个相应包token的值。
Brute Force Source <?php if( isset( $_GET[ 'Login' ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Sanitise username input $user = $_GET[ 'username' ]; $user = stripslashes( $user ); $user = mysql_real_escape_string( $user ); // Sanitise password input $pass = $_GET[ 'password' ]; $pass = stripslashes( $pass ); $pass = mysql_real_escape_string( $pass ); $pass = md5( $pass ); // Check database $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); if( $result && mysql_num_rows( $result ) == 1 ) { // Get users details $avatar = mysql_result( $result, 0, "avatar" ); // Login successful echo "<p>Welcome to the password protected area {$user}</p>"; echo "<img src=\"{$avatar}\" />"; } else { // Login failed sleep( rand( 0, 3 ) ); echo "<pre><br />Username and/or password incorrect.</pre>"; } mysql_close(); } // Generate Anti-CSRF token generateSessionToken(); ?>
几个函数:
isset()
:用于检测变量是否已设置并且非 NULL。checkToken()
:自定义函数,判断请求包中的token和服务端保存的token是否一致。stripslashes()
:去除\
。mysql_real_escape_string()
:转义在 SQL 语句中使用的字符串中的特殊字符,如\x00
、\n
、\r
、\
、'
、"
和 \x1a
。High 级别的代码使用了stripslashes 函数,会过滤输入的内容。同时使用了 Token 抵御 CSRF 攻击,在每次登录时网页会随机生成一个 user_token 参数,在用户提交用户名和密码时要对 token 进行检查再进行 sql 查询。
由于服务器没有对用户的输入次数进行限制,导致攻击者可以利用爆破的手段来进行攻击,通过穷举法将用户名、密码等信息爆出来。当攻击者结合社会工程学生成了庞大的字典时,爆破攻击的可能性将会被增大。对于爆破漏洞,开发者可以对用户的登陆次数设置阈值,当某用户名表示的用户的登录次数在一定时间内超过阈值时,就暂时锁定用户。也可以进行 IP 检测,如果某个 IP 的登录次数超过阈值也可以锁定 IP。当然还有一种我们熟悉的方式,就是设置只有人可以通过验证的验证码或者是其他的验证手法,来保证进行登录操作的是人而不是机器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。