//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php"); //包含数据库连接文件
error_reporting(0);
// take the variables
if(isset($_GET['id']))//从get方式中获取的id是否为空,非空继续
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.记录测试信息,生成一个txt。
$fp=fopen('result.txt','a'); //Open for writing only
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);//数据库查询
$row = mysql_fetch_array($result);//将查询到的结果放入数组中,查询得到结果的话,row非空
if($row)
{//查询得到结果
echo "";
echo 'Your Login name:'. $row['username'];
echo 'Your Password:' .$row['password'];
}
else
{//查询不到结果
echo '';
print_r(mysql_error()); //mysql报错,报详细信息
}
}
else { echo "Please input the ID as parameter with numeric value";}
//没从get方式中获取到id
?>
font> div>br>br>br><center>
<img src="../images/Less-1.jpg" />center>
body>
html>
//including the Mysql connect parameters.
include("../sql-connections/db-creds.inc");//包含数据库账户信息
error_reporting(0);
//mysql connections for stacked query examples.
$con1 = mysqli_connect($host,$dbuser,$dbpass);
// Check connection
if (mysqli_connect_errno($con1))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
{
@mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database: $dbname");
}
?>
//give your mysql connection username n password
$dbuser ='root';//数据库用户
$dbpass ='';//数据库密码
$dbname ="security";// 数据库名
$host = 'localhost';//主机
$dbname1 = "challenges";
?>
if(isset($_GET['id']))//从get方式中获取的id是否为空,非空继续
{
$id=$_GET['id'];}
else { echo "Please input the ID as parameter with numeric value";}
//没从get方式中获取到id
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
//
}
else
{
print_r(mysql_error()); //输出错误
echo "";
}
}
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
跟Less-1的index.php不同之处:
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
整数型
if(isset($_GET['id']))
{
$id=$_GET['id'];
else
{
echo "Please input the ID as parameter with numeric value";
}
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{//}
else //查询不到数据或查询出错
{
echo '';
print_r(mysql_error()); //返回详细的错误结果
echo "";
}
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
基于错误
同Less-1,2
单引号变形 字符型:
// connectivity
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
基于错误
同Less-1,2,3
双引号 字符型
// connectivity
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
代码同Less-1,返回结果不同而已。
echo 'You are in...........';
Less-1返回的结果是:
echo 'Your Login name:'. $row['username'];
echo "
";
echo 'Your Password:' .$row['password'];
web前端页面返回结果的不同,导致你在Less-5中就算注入成功了,注入攻击代码后,也会看起来并没有什么实际作用。但事实上,你的注入是成功的。
白盒测试后,才发现其真正的原因。
???
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
单引号 双括号
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
非基于错误,提示使用outfile函数
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo 'You are in.... Use outfile......';//提示使用呕吐file函数
}
else
{
echo 'You have an error in your SQL syntax';//每次仅返回模糊的提示
//print_r(mysql_error()); 不返回详细的错误
echo "";
}
}
只返回两种结果,查询得到结果的话,返回You are in………..,反之,为空,啥错误提示都不返回,要注意两个页面间细微的变化
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '';
echo 'You are in...........';
echo "
";
echo "";
}
else
{
echo '';
//echo 'You are in...........';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "";
echo '';
}
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
无论你的查询结果如何,都返回同样的界面You are in………..,所以等于没有返回有用的信息。所以这个时候,只能通过mysql的一些函数来进行判断。
例如:
sleep(n):执行将程序(进程)挂起一段时间
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '';
echo 'You are in...........';
echo "
";
echo "";
}
else
{
echo '';
echo 'You are in...........';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "";
echo '';
}
}
// connectivity
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
}
// connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
}
// connectivity
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
}
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{// }
else //查询不到数据or出错
{
echo '';
//echo "Try again looser";
print_r(mysql_error()); //输出详细错误
}
// connectivity
@$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
}
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
//
}
else
{
//echo "Try again looser";
print_r(mysql_error());//输出详细错误
}
// connectivity
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
@$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
}
查询得到数据返回图片1(TRUE),反之返回图片2
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
//
echo '';
}
else
{
//
echo '';
}
// connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
}
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '';
}
else
{
echo '';
}
// connectivity
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
function check_input($value)
{
if(!empty($value))//检查值是否为空
{
// truncation (see comments)
$value = substr($value,0,15);//限制了长度,从第一个字符开始,截取前15个字符
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);//去掉斜线
}
// Quote if not a number
if (!ctype_digit($value)) //如果值不是纯十进制数字
{
$value = "'" . mysql_real_escape_string($value) . "'";//对值加上引号,并且对不安全字符进行转义
}
else//如果为空
{
$value = intval($value);
}
return $value;
}
$rest = substr("abcdef", -1); // returns "f"
$rest = substr("abcdef", -2); // returns "ef"
本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。
当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’”加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。
如果没有打开这项设置,可以使用addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。
这些字符是单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)。
默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。
不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
ctype_digit()函数:
Check for numeric character(s)
如果 text 字符串是一个十进制数字,就返回 TRUE ;反之就返回 FALSE 。
mysql_real_escape_string()
本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集,因此可以安全用于 mysql_query()。
mysql_real_escape_string() 调用mysql库的函数 mysql_real_escape_string, 在以下字符前添加反斜杠: \x00, \n, \r, , ‘, ” 和 \x1a.
为了安全起见,在像MySQL传送查询前,必须调用这个函数(除了少数例外情况)。
只对uname进行了过滤
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
}
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
$row1 = $row['username']; //
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";//更改密码
mysql_query($update);//进行数据更改
if (mysql_error()) //如果有错误,爆出数据库详细错误
{
print_r(mysql_error());
}
else
{
echo '';
//echo " You password has been successfully updated " ;
echo "
";
echo "";
}
echo '';
}
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
}//对uname和passwd都进行数据过滤
//获取用户的uagent和IP
$uagent = $_SERVER['HTTP_USER_AGENT'];
$IP = $_SERVER['REMOTE_ADDR'];
echo "
";
echo 'Your IP ADDRESS is: ' .$IP;
echo "
";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)//登录成功
{
//将用户的uagent,ip,uname插入到一张表中
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert); //进行插入数据
echo 'Your User Agent is: ' .$uagent;
print_r(mysql_error()); //输出详细错误
}
else
{
echo '';
print_r(mysql_error()); //输出详细错误
echo '';
echo "";
}
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
POST
同18,对uname和passwd都进行数据过滤
头信息 - referer 基于错误
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)//是否登录成功
{
//如果登录成功,将用户的referer,ip插入到一张表中
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
mysql_query($insert);//进行数据插入
echo 'Your Referer is: ' .$uagent;
print_r(mysql_error());
echo '';
}
else
{
echo '';
print_r(mysql_error());
echo '';
}
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
POST
同上
cookie注入
//uname和passwd都做了过滤,而cookie没有,直接获取
$cookee = $_COOKIE['uname'];
$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
//存在一个跟cookie相关的sql语句操作,由于未进行任何过滤,所以存在cookie注入
connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
if(!isset($_COOKIE['uname'])) { //没收到用户发的cookie,可能是新用户,所以要重新发一个cookie
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
Welcome '#FF0000'> Dhakkan </font>