1.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 = 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
echo "<pre><br />Username and/or password incorrect.</pre>";
}
mysql_close();
}
?>
isset():用于检测变量是否已经设置并且非NULL,返回true.
mysql_num_rows() 返回结果集中行的数目。此命令仅对 SELECT 语句有效。要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()。 用法:首先使用 mysql_query() 通过 SQL 语句获得结果集,然后再用 mysql_num_rows() 获得数据库的记录行数。
mysql_query() 函数执行一条 MySQL 查询。mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。
选中需要暴力破解的位置,导入密码字典就可以进行爆破
返回长度与其他不同的,即为正确密码
原理:
- 当登陆成功时,页面信息也就是服务器返回的信息(数据包)与登录失败时的返回信息不同,但是一般登录失败时返回的数据包基本是相同的
- 这就导致了所有登录失败的回包长度都相同,一旦登陆成功,该数据包长度就与其他包Length不同,所以能够达到一个结果的反馈
2.brute force(暴力破解medium)
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );
// Check the 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( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
mysql_close();
}
?>
与low相比,多了 $pass = mysql_real_escape_string( $pass );和sleep(2)
mysql_real_escape_string()函数转义在SQL语句中使用的字符串中的特殊字符,返回已转义的字符串,mysql_real_escape_string()函数不转义"%" 和 "_"这两个符号。故此函数可以防止sql注入。
步骤与第一题low一样
3.commond injection(命令执行low)
命令注入:
产生原因一般是将用户输入未经过滤或者过滤不言就直接当作系统命令进行执行,我们可以通过批处理中的一些技巧来一次执行多条命令,这样就可以执行任意命令。
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
stristr函数:用来实现搜索字符串在另一字符串中的第一次出现,大小写不敏感。stristr(string,search,before_search),参数string必需,规定被搜索的字符串;search必需,规定要搜索的字符串。
如:stristr("Hello world!","WORLD")——查找 "world" 在 "Hello world!" 中的第一次出现
stristr( php_uname( 's' ), 'Windows NT' )
根据服务器是否为windowsNT系统,对目标ip进行不同的ping测试
php_uname — 返回运行 PHP 的系统的有关信息。
a':此为默认。包含序列 "s n r v m" 里的所有模式。
's':操作系统名称。例如: FreeBSD。
'n':主机名。例如: localhost.example.com。
'r':版本名称,例如: 5.1.2-RELEASE。
'v':版本信息。操作系统之间有很大的不同。
'm':机器类型。例如:i386。
eg:
$v = php_uname('a');
print_r($v);
echo '
命令连接符:
a && b :代表首先执行前者命令a再执行后命令b,但是前提条件是命令a执行正确才会执行命令b,在a执行失败的情况下不会执行b命令。所以又被称为短路运算符。
a & b:代表首先执行命令a再执行命令b,如果a执行失败,还是会继续执行命令b。也就是说命令b的执行不会受到命令a的干扰。
a || b:代表首先执行a命令再执行b命令,如果a命令执行成功,就不会执行b命令,相反,如果a命令执行不成功,就会执行b命令。(前面的命令执行失败,它后面的命令才被执行)
a | b:代表首先执行a命令,再执行b命令,不管a命令成功与否,都会去执行b命令。
输入127.0.0.1&ipconfig:就会出现该IP详细信息(已经改了dvwapage.inc.php但还是出现乱码????????)