POST[‘id’]二次注入在网站业务在注入点出现在注册页reg.php
我们在注册的时候,如果’ union select 1,2,3,4#这样的语句能带入数据库,但没有直接利用办法,那就能通过查询search.php来sql注入
前端这里写一个Form
<form action="reg.php" method="POST">
id:<input type="text" name="id"><br>
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
email:<input type="text" name="email"><br>
<input type="submit" name="login">
</form>
为了方便,吧前端内容写入reg.php,这里注意<?php?> 第二个问好闭合就行。
同样,isset函数判断是否通过login属性登录,不是返回false失败
对变量做addslashes函数处理,如果脏数据被过滤只会返回查询失败。
$id $username $password $email
$id = addslashes($_POST['id']);
$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);
$email = addslashes($_POST['email']);
然后就是正常post型和mysql交互,,$sql 语句用的是INSERT INTO 注册。
mysql_select_db('admin',$conn);
$sql = "INSERT INTO admin_table (id,username,password,email) values('$id','$username','$password','$email')";
$result = mysql_query($sql) or die(mysql_error());
注册成功,返回true ,注册失败,返回false
if($result){
echo "register success";
}else{
echo "register false";
}
完整源码
<?php
header("content-type:text/html;charset-utf-8");
if(!empty($_POST['login'])){
$id = addslashes($_POST['id']);
$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);
$email = addslashes($_POST['email']);
$conn = mysql_connect('localhost','root','root');
mysql_select_db('admin',$conn);
$sql = "INSERT INTO admin_table (id,username,password,email) values('$id','$username','$password','$email')";
$result = mysql_query($sql) or die(mysql_error());
if($result){
echo "register success";
}else{
echo "register false";
}
}else{
echo "false";
}
?>
<form action="reg.php" method="POST">
id:<input type="text" name="id"><br>
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
email:<input type="text" name="email"><br>
<input type="submit" name="login">
</form>
然后我们写search1.php查询页面,通过myql获取reg的sql注入
前端
<form action="search1.php" method="POST">
输入查询的ID<input type="text" name="id"><br>
<input type="submit" name="submit"><br>
</form>
search的源码和POST几乎都是差不多的,几个函数和mysql交互,
这里本来应该直接放源码,但抱着学习扎实的态度。
正常的ID查询
if(!empty($_POST['submit'])){
$id = $_POST['id'];
$conn = mysql_connect('localhost','root','root');
mysql_select_db('admin',$conn);
$sql = "select * from admin_table where id='$id'"; //网页提供的查询
$result = mysql_query($sql) or die(mysql_error());
注意这里,由于业务的原因,这里需要查询$username的身份,
,而且我们在reg注册时,在username插入了sql脏数据
这里我们输入注册的ID=13,,第二个sql语句执行我们的sql注入
得到回显点
换成’union select 1,user(),3,4#
search1.php的完整源码
<?php
header("content-type:text/html;charset=utf-8");
if(!empty($_POST['submit'])){
$id = $_POST['id'];
$conn = mysql_connect('localhost','root','root');
mysql_select_db('admin',$conn);
$sql = "select * from admin_table where id='$id'"; //网页提供的查询
$result = mysql_query($sql) or die(mysql_error()); //做mysql查询
while($row = mysql_fetch_array($result)){
$username = $row['username'];
$sql = "select * from admin_table where username='$username'"; //POST提交的sql
$result = mysql_query($sql) 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>";
echo "email:".$row['email']."<br>";
}
}
}
?>
<form action="search1.php" method="POST">
输入查询的ID<input type="text" name="id"><br>
<input type="submit" name="submit"><br>
</form>
GET[‘id’] 宽字节注入
宽字节:GB2312 GBK BIG5 这些都是,mysql采用这些编码和网站编码不同时,就会有编码手段的注入
比如
$a=addslashes($_GET['id'])
echo $a
我们输入 ?id=1’ 他就转移成?id=1’
这时mysql注入就失败了,,
但 他存在宽字节注入 id=1%df’ ,%df和\组成汉字,就吧转义字符吃掉了。
mysql有一个特性,汉字不影响查询,也就是说,,这样也是可以的
$sql = select * from admin_table where id='1運'#'