这里,_GET[‘id’]和_POST[‘id’]很多人都知道,,
但我们做php审计,后面的宽字节注入和二次注入都会和mysql交互,那审计这两段源码就非常重要。
这里建个php,放到www下面,
GET型 如果下面不带前端源码,写成这样也行。
<?php
定义一个变量$conn通过mysql_connect(server:'localhost',username:'root',passsword:'root');
函数建立mysql连接
下一步我们用一个变量$sql or $a 接受查询语句
$a = "select * from admin_table where id='$id'";
第三步,我们通过mysql_query()函数做数据库查询,这个函数返回值是false or true ,查询成功或失败对mysql没有影响,成功返回数据,失败了返回mysql_error()函数。
$result = mysql_query($a) or die(mysql_error());
完整源码
<?php
$id=$_GET['id'];
$conn = mysql_connect('localhost','root','root');
mysql_select_db("admin",$conn);
$a = "select * from admin_table where id='$id'";
$result = mysql_query($a) or die(mysql_error());
while ($row = mysql_fetch_array($result)){
echo "ID:".$row['id']."<br>";
echo "USERNAME:".$row['username']."<br>";
echo "PASSWORD:".$row['password']."<br>";
}
mysql_close($conn);
echo "<hr>";
echo $a;
?>
我们站点做测试
GET传入一个参数?id=1
看源码,我们做的字符型,id用单引号包围,构造1’–+ or 1’# 闭合
这里是字符型,,如果是数字型,,源码换成
$a = "select * from admin_table where id=$id";
判断数字型 :$id-1|| $id+1
id后加引号报错但不能闭合,变量没有引号包围,都算数字型
然后我们来写_POST[‘id’]的注入;
先写一个前端页面,注意name的值,
<form action="sqlinjection1.php" method="post">
账号: <input type="text" name="username"><br>
密码: <input type="password" name="password">
<input type="submit" name="login" >
</form>
然后用前面学的isset函数做登录检测
if(!isset($_POST['login'])){
echo "false";}
同样先函数myql_connect(xxx,xxx,xxx)建立连接,mysql_select_db选中活动数据库,,
然后开始写sql语句,POST这两种写法都可以’ " .$username." ’ " 闭合也行
$a = "select * from admin_table where username='$username'";
//$a = "select * from admin_table where username='".$username."'";
用$result变量接受查询结果,查询成功,用mysql_fetch_array函数传参赋值,查询失败,通过 mysql_error()函数处理
while($row = mysql_fetch_array($result)){
$db_username = $row['username'];
$db_password = $row['password'];
}
然后如果查询的数据内容:账号和密码和输入的匹配,那么输出success,登录成功。登录失败,设置断点,看是否$sql做了查询,
if($db_password== $password && $db_username==$username){
echo "success";
}
else{
echo "false"."<br>";
// echo $db_username.$db_password."<br>";
//echo "pasword:".$password;
}
完整源码
<?php
if(!isset($_POST['login'])){
echo "false";
}else{
$username = $_POST['username'];
$password = $_POST['password'];
$conn = mysql_connect('localhost','root','root');
mysql_select_db('admin',$conn);
//$a = "select * from admin_table where username='".$username."'";
$a = "select * from admin_table where username='$username'";
//$a = "select * from admin_table where username='admin' or 1=1"
$result = mysql_query($a) or die(mysql_error());
while($row = mysql_fetch_array($result)){
$db_username = $row['username'];
$db_password = $row['password'];
}
if($db_password== $password && $db_username==$username){
echo "success";
}else{
echo "false"."<br>";
// echo $db_username.$db_password."<br>";
//echo "pasword:".$password;
}
}
注意看这里我是做了万能密码的,但他没有登录成功
$a = "select * from admin_table where username='admin' or 1=1#"
网上对万能密码解释都解释不清楚,,我们看这里,,首先构造了’ 和前面的闭合,,通过#注释掉后面的内容,,所以我们做查询返回的是整个表
这里看navicat
看这里,我们通过if函数对查询出来的结果和输入的结果做匹配,
这里做了断点,很明显看到数据库查询出
username=Guest password=4321
但没绕过登录,,如果登录检测只对查询mysql中是否存在记录,而不对输入做检测,那么这里就成了万能密码。。