吴旭华 发表于 2024-8-8 00:09:49

SQL二次注入

目录
1.什么是二次注入?
2.二次注入过程
2.1探求注入点 
2.2注册admin'#用户
2.3修改暗码

1.什么是二次注入?

当用户提交的恶意数据被存入数据库后,因为被过滤函数过滤掉了,所以无法生效,但应用程序在从数据库中拿出该用户名时没有对'和#进行转义,导致将暗码的检测注释了,虽然看似后端代码将我们输入的'进行了转义,但是当将输入的数据存储到数据库中时,会将'加上存储的(数据库存储数据的特征),如许就实现了二次注入,也叫做存储型SQL注入。
2.二次注入过程

登录页面
https://i-blog.csdnimg.cn/direct/e9b140f7fb1c413dbdc2320a985994e2.png
注册页面 
https://i-blog.csdnimg.cn/direct/8cc6170d0e9a44c08c0dc88dfe4e321b.png 修改暗码页面
https://i-blog.csdnimg.cn/direct/77d6a597208e490bbea89ec1aee0ecdf.png
2.1探求注入点 

https://i-blog.csdnimg.cn/direct/f53072b82cf8473ca803fc820f3afdb8.png
https://i-blog.csdnimg.cn/direct/1b7a8ff72fa94053934f3d192d163274.png
进行一些简单的测试,发现都无法乐成 
检察后端代码发现,后端代码对我们输入的登任命户名和暗码进行了过滤,因此无法注入
function sqllogin(){

   $username = mysql_real_escape_string($_POST["login_user"]);//过滤了单双引号
   $password = mysql_real_escape_string($_POST["login_password"]);//过滤了单双引号
   $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
//$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";
   $res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
   $row = mysql_fetch_row($res);
        //print_r($row) ;
   if ($row) {
                        return $row;
   } else {
                      return 0;
   }

} 但是发现pass_change.php文件中,修改暗码时,当从数据库中找出所修改的用户的暗码时,没有对username进行过滤,导致出现二次注入点。
if (isset($_POST['submit']))
{
       
       
        # Validating the user input........
        $username= $_SESSION["username"];
        $curr_pass= mysql_real_escape_string($_POST['current_password']);
        $pass= mysql_real_escape_string($_POST['password']);
        $re_pass= mysql_real_escape_string($_POST['re_password']);
       
        if($pass==$re_pass)
        {       
                $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
                $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
                $row = mysql_affected_rows();
                echo '<font size="3" color="#FFFF00">';
                echo '<center>'; 我们是否可以先注册一个类似admin'#的用户,然后当对admin‘#用户进行修改暗码时来进行注入呢?话不多说,直接开干
2.2注册admin'#用户

https://i-blog.csdnimg.cn/direct/438066cc0fd7409e8ea3fc206e7e1a65.png
发现可以注册,与我们假想的一样
然后进行登录
https://i-blog.csdnimg.cn/direct/4b2be396b6994d719e69bc98e3ff27ec.png
顺利登录,此时页面显示YOU ARE LOGGED IN AS admin'#
https://i-blog.csdnimg.cn/direct/2025ccf14bd94ce0a19d3601cd8cbd4d.png
2.3修改暗码

根据pass_change.php文件的代码分析,current password可以随便填写,只要New Password便是Retype Password,程序就会进入if语句中,sql语句就会生效
if (isset($_POST['submit']))
{
       
       
        # Validating the user input........
        $username= $_SESSION["username"];
        $curr_pass= mysql_real_escape_string($_POST['current_password']);
        $pass= mysql_real_escape_string($_POST['password']);
        $re_pass= mysql_real_escape_string($_POST['re_password']);
       
        if($pass==$re_pass)
        {       
                $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
                $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
                $row = mysql_affected_rows();
                echo '<font size="3" color="#FFFF00">';
                echo '<center>'; 此时我们将修改的暗码进行提交后,admin'#进入sql语句中,上述sql语句就会变为 
   $sql = "UPDATE users SET PASSWORD='$pass' where username='$admin'#' and password='$curr_pass' ";
标红的地方就会被注释掉,就会乐成修改admin的暗码
https://i-blog.csdnimg.cn/direct/e09886ad46624ef2827f0750ef98de18.png
此时我们利用admin用户进行登录,测试admin的暗码是否被修改
https://i-blog.csdnimg.cn/direct/3b3514d705ee4a7ebc71f3364acee782.png
https://i-blog.csdnimg.cn/direct/4096c00af1444f42b94303c26707c765.png
可以见到,我们确实用admin用户乐成登录,在这之前我们是不知道admin用户的暗码的
这就是sql二次注入,可以利用它来修改任意用户的暗码,所以危害是比较大的






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: SQL二次注入