w2015 发表于 2016-11-23 14:18:00

关于一次对sql二次注入的学习!

刚学几天php,然后看到了二次注入这个办法,我就想本地搭建测试下!然后过程如下:
首先附上代码:
<html>
<head>
<title>SQL注入</title>
</head>
<body>
<h1>二次注入!<h2>
<form action="" method="post">
用户名注册:<input type="text" name="user"><br>
密码注册:<input type="text" name="pass">
<input type="submit" name="submit" value="注册">
<br>sql插入数据语句如下:</br>
<?php
$user=$_POST["user"];
$pass=$_POST["pass"];
$conn=mysql_connect("localhost","root","root");
if(!$conn){
        die("error!");
}
//if(isset($user1) && isset($pass1)){
$user=addslashes($user);
$pass=addslashes($pass);
mysql_select_db("test",$conn);
$sql="insert into test (test1,test2) values ('$user','$pass')";
$sql1=mysql_query($sql,$conn);
if($sql1){
        echo $sql . "<br>";
} else {
        "写入失败。";
}
/*} else {
        echo "请输入账号密码注册!";
}*/
?>
</body>
</html>
<html>
<head>
<title>SQL注入</title>
</head>
<body>
<h1>二次注入!<h2>
<form action="" method="post">
账号查询:<input type="text" name="name">
<input type="submit" name="submit"><br>
<?php
header('Content-type: text/html; charset=utf-8');
$name=$_POST["name"];
$name=addslashes($name);
$conn=mysql_connect("localhost","root","root");
if(!$conn){
        die("error!");
}
mysql_select_db("test",$conn);
$sql="select * from test where test1='{$name}'";
$sql1=mysql_query($sql,$conn) or die(mysql_error());
$rows=mysql_fetch_array($sql1);
$pass=$rows['test2'];
if($sql1){
       
        //$pass=$rows['test2']
        $sql2="select * from test where test2='$pass'";
        $sql3=mysql_query($sql2) or die(mysql_error());
       echo "<br>";
       print_r($sql3);
        var_dump($sql3);
        echo "查询语句:" . $sql2;
} else {
        "查询失败。";
}
?>
</body>
</html>
小菜刚学几天php,所以代码写的特别乱,还有很多地方写的多余。但是都是自己慢慢一步步写的,慢慢百度学习的,
并没有copy网上脚本或者修改的。所以代码太渣,还望大家谅解。
总结帮助不太了解的小伙伴理理思路:
1.首先通过账号密码注册向数据库写入单引号。由于存在转移,所以直接注入是不行的。但是我们的单引号会写入数据库中储存。
2.通过查询账号将我们刚才写入的带有单引号的数据select出来。(我写在密码中的,你也就可以这么理解,找回密码处,你输入账号,他就会将密码select出来给你)
这个时候,并没有对单引号进行过滤,所以就造成了引入单引号。造成了注入。

1.这里我首先写入了账号123456',密码123456的作为测试。很明显看到了单引号被转移了。所以不存在注入。

刚才的单引号存在数据库中的数据却没有转移,直接就是123456'。

然后我将类似的注入语句写入了进去,账号123,密码:1' and updatexml(1,concat(0x7e,(version())),0) or ' 类似的报错语句都可以。

然后我们在查询账号来输出密码。就看到了成功造成了注入。注意看mysql监控中的两条语句的内容和先后顺序。

然后和上面同样的道理写入查询版本的语句。

然后也出来了。二次注入就是先向数据库写入带单引号的注入语句,在来查询出来。
文章只为和大家分享科普文,大牛勿喷!同时问个php问题如下:

如果有学php的小伙伴,可以一起学习php。






xiaoye 发表于 2016-11-23 15:42:11

吓到宝宝了,实话说,几天?

90_ 发表于 2016-11-23 15:48:05

先学好mysql语法

w2015 发表于 2016-11-23 17:07:49

RE: 关于一次对sql二次注入的学习!

xiaoye 发表于 2016-11-23 15:42
吓到宝宝了,实话说,几天?

好像是第6天了,代码虽少,但我却写了几小时,一直在出错!:'(

w2015 发表于 2016-11-23 17:08:23

RE: 关于一次对sql二次注入的学习!

90_ 发表于 2016-11-23 15:48
先学好mysql语法

嗯嗯,90表哥说得在,目前在同时学习mysql语法!:lol

sladjfksld 发表于 2016-11-23 17:12:22

不错,妹子有前途!

周翔宇 发表于 2016-11-23 21:28:08

楼主很不错。前几天买了《sql注入攻击与防御》,发现不学php不行了,就开始学。跟楼主学习学习。

SVK 发表于 2016-11-23 22:15:51

厉害了

w2015 发表于 2016-11-23 23:13:24

RE: 关于一次对sql二次注入的学习!

周翔宇 发表于 2016-11-23 21:28
楼主很不错。前几天买了《sql注入攻击与防御》,发现不学php不行了,就开始学。跟楼主学习学习。 ...

大兄弟说笑了!一起学习!

w2015 发表于 2016-11-23 23:13:48

RE: 关于一次对sql二次注入的学习!

SVK 发表于 2016-11-23 22:15
厉害了

{:2_31:}一起学习走一波!
页: [1] 2
查看完整版本: 关于一次对sql二次注入的学习!