Brute Force
LOW级
查看源码
下面展示一些 内联代码片
。
下面展示一些 内联代码片
。
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];
// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
LOW级源码可以看出没有任何防护措施,我们甚至可以用SQL注入进行攻击,但这里先说爆破,爆破需要用到brupsuite,抓包。
抓包
具体如何抓包这里就不做过多解释,前面的文章也有提到,抓到的包如下:
右击发送到Intruder
如图,用§包住的就是我们要爆破的目标,我们先清除所有的§,这次我们要爆破出密码,就只给密码进行标记
之后选择爆破类型,不同的爆破类型将字典中的数据替换到标记位置的方式也会有所不同,在LOW级难度里我们用Sniper,它的规则是把字典中的字符串一个一个替换到我们前面标记的位置进行爆破。
之后添加字典
开始爆破
当密码正确是,反应时间会有所不同,根据反应时间的不同我们可以确定密码为password
Medium级
查看源码
下面展示一些 内联代码片
。
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
我们会发现多了一行
下面展示一些 内联代码片
。
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
isset() 函数用于检测变量是否已设置并且非 NULL。返回TRUE。若变量不存在则返回 FALSE(错误),若变量存在且其值为NULL(无效),也返回 FALSE,若变量存在且值不为NULL,则返回 TURE(真),同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
is_object() 函数用于检测变量是否是一个对象
mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。返回已转义的字符串
最后一旦密码错误会延迟两秒,这个会增加我们的爆破时间,但是依然是可以爆破出来的,方法同Low级一样
High级
查看源码
下面展示一些 内联代码片
。
<?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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["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>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
// Generate Anti-CSRF token
generateSessionToken();
?>
我们可以看到加上了Token值, stripslashes(string)是去除掉string字符的反斜杠\,使用了stripslashes函数和mysqli_real_esacpe_string来抵御SQL注入和XSS的攻击。而对于Token,Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
爆破
爆破模式Attack type选用Pitchfork,Pitchfork对每个标记字段单独设置字典,按照一一对应的关系取最少的组合
求包与自己的响应包有对应顺序,需要单线程,在Resource pool中添加一个单线程,线程数量修改为1。
在Options选项中,找到Grep Extract栏,添加一个从响应包中的提取规则。点击Add,并从响应报文中找到对应的token信息位置,选中之后会自动生成匹配规则,然后点击OK确定。确定之后会在Grep-Extract列表中出现这一规则。
之后设置字典,选择类型为递归,就是说前一次爆破产生的token将继续用在下一次,递归查询:从response中提取数据 user_token 的,然后去替换我们爆破的值
Set1的设置和LOW级一样
之后就可以开始爆破
Command Injection
Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一。黑客如果能够利用命令执行漏洞,那么黑客就可以像电脑用户控制自己电脑一样,自由地对电脑进行操作,就好像通过CMD进行对计算机进行操作
LOW
查看源码
可以看到这里直接将target 变量放入 shell_exec()执行ping命令,没有进行任何过滤,用户端可以直接拼接特定的命令,来执行并获取想要的信息。
A; B //A不论正确与否都会执行B
A&B //A后台运行,A和B同时执行
A&&B //A执行成功后才会执行B
A|B //A执行的输出结果作为B命令的参数,A不论正确与否,都会执行B
A||B //A执行失败后才会执行B命令
直接输入127.0.0.1&&ipconfig,可以看到把IP信息也显示出来了,之后我们甚至可以127.0.0.1&&ping baidu.com ,想干嘛干嘛
Medium级
这里设置了黑名单过滤规则,但是只过滤了两种字符’&&’ 和’;',我们可以用&,||等进行绕过
High级
看上去,似乎敏感的字符都被过滤了,但是 | 明显后面有个空格,所以如果不使用空格的话依然可以绕过: