SQL注入——二次注入入门题:Three Hit

SQL注入——二次注入入门题:Three Hit

  • (一)二次注入简介
  • (二)入门题目: Three Hit 解析

(一)二次注入简介

  二次注入是SQL注入的一个子类,如果对SQL注入不太了解的话可以参考之前博客的介绍:SQL注入简介——堆叠注入.

  下面来讲什么是二次注入:

  二次注入,是指已存储(数据库、文件)的用户的输入被读取后再次进入到 SQL 查询语句中导致的注入。

  由此可见,二次注入与普通的数据注入的区别是:普通注入数据是直接进入到 SQL 查询中,而二次注入是输入数据(恶意数据)经处理后存储,取出后,再次进入到 SQL 查询。

  防御者可能在用户输入恶意数据时会对其中的特殊字符进行转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

SQL注入——二次注入入门题:Three Hit_第1张图片                  (图片来源于网络)

(二)入门题目: Three Hit 解析

  这里来看一道二次注入的入门题,来更好的了解什么是二次注入。

  这是一道来自第二届全国强网杯的Web题目“Three Hit”:

SQL注入——二次注入入门题:Three Hit_第2张图片        (因为没找到原题所以只能拿网络来源的图片云一下自己的解说了)

  这道题看到主界面的第一步是想到构造语句尝试注入,比如输入一个名为“admin’#”的用户名尝试注入。不过会收到注入失败的结果。查看网页源码可以发现这样的一部分代码:

// 部分代码如下
$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'";
//

  其中的“mysql_real_escape_string”是对输入的内容进行了转义处理,因此无法在登陆时进行SQL注入。

  那么可以换一种方法,尝试使用页面提供的注册功能,我们来注册一个账号。

SQL注入——二次注入入门题:Three Hit_第3张图片
  如图,我们可以在这里尝试注册一个名为“admin’#”的账号,设置初始密码为“123456”(随便设置,其他的也可以)。

  然后,我们就可以使用注册得到的账号进行登陆。登陆后会发现网站有给出了修改密码的功能。因为“admin’#”语句能够被注册则表明数据库中可能已经完成了“admin’#”用户的插入,注入的语句可能已经生效。那么我们就可以利用网站的修改密码功能,进行间接(或者说直接好像也行)修改目标的“admin”账户的密码。这里可以试着改成“1235678”(也是随便设置的)。

SQL注入——二次注入入门题:Three Hit_第4张图片
  下面可以从后端视角看一下注入操作实现的效果:

SQL注入——二次注入入门题:Three Hit_第5张图片                    (修改前)

SQL注入——二次注入入门题:Three Hit_第6张图片                    (修改后)

  解释:因为一开始注册时,用户名的设置就将恶意数据成功存储进了数据库,而程序再取数据库中的数据的时候没有进行对数据的二次判断便直接带入到代码中,从而造成了二次注入。

// 代码解释
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
造成图片中的后端改变的原因,是上面的数据库更新语句在取出用户名为 "admin'#" 时执行的实际是:
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";
这就相当于取出的用户名不是一个无功能的字符串而是一个具有功能的SQL语句,从而使得原admin密码发生改变。
//

  本文参考: SQL注入防御绕过——二次注入.
        二次注入原理及防御.

(本人为初学者,若本文的理解有误,还请内行人士予以指正。)

你可能感兴趣的:(SQL注入——二次注入入门题:Three Hit)