SQL手工注入保姆级教程(封神台黑客靶场1-1)
注:本教程仅供交流学习使用,请遵守网络安全相关法律法规,如果使用本技术对其他网站进行攻击,本人概不负责!
本教程需要一定的Mysql数据库知识,如果看不懂本教程中的代码可以学习Mysql。
现在由我来讲解一下封神台黑客靶场1-1 SQL注入攻击原理与实战演练。在开始实际操作前,我们先来了解一下sql注入到底是什么。由于一些开发者在开发过程中,直接将URL中的参数,http body中的post参数等其他外来用户输入参数与SQL语句进行拼接,导致了我们可以执行任何SQL语句。
例:<?php
...
$id=$GET('id');
$getid="select id from users where user_id=‘$id'";
$result=mysql_query($getid) or die('<pre>'.mysql_error.'</pre>');
$num=mysql_numrows($result);
以上PHP代码来自于CTF特训营P14
我们看一下$id这个变量,这个变量会直接与SQL语句进行拼接,那么,如果我们传入这样一段SQL指令:
-1‘ union select 1,2,3 --
那么,SQL语句将会变成
select id from users where user_id = '-1' union select 1,2,3
到这里可能会有这样一个疑问:为什么要闭合单引号且为什么有一个单引号没有了呢。
我们接下来逐一解答。
Q:为什么要闭合单引号?
A:我举一个例子你就明白了。如果我们不闭合单引号,这一段SQL语句将会变为
select id from users where user id = '-1 union select 1,2,3'
发现问题了吗,原本我们注入的SQL语句,在单引号中变成了字符串,导致我们注入的SQL语句无法执行。
Q:为什么有一个单引号不见了
A:--是Mysql中的注释符,注释掉了一个单引号,才能使得前面的单引号闭合。
如果没有注释,我们的SQL语句将会变成
select id from users where user_id = ''-1 union select 1,2,3'
说到这里,在看本教程的各位有没有对SQL注入的原理和方法有一个基本的了解呢?
——————分割线——————
原理和技术讲完了,我们现在进入靶场实战。
我们这次完成的是封神台黑客靶场1-1,关卡详情如下。

点击传送门后,我们进入了靶场,我们可以看到,靶场首页有一个链接。

点击链接后,我们跳转进了一个猫舍介绍界面,网址为cntj8003.ia.aqlab.cn?id=1
那么我们前面有讲过,可以利用GET进行传入SQL语句,我们来试一下。

首先我们传入一个单引号,来检查是否存在单引号闭合,如果传入后页面正常,则存在单引号闭合,如果传入后页面异常,则不存在单引号闭合,我们可以继续尝试双引号闭合。

传入单引号进入页面发现页面异常,则不存在单引号闭合,那么如果我们传入双引号呢?

返回结果依旧是页面异常,由此我们断定,此处无需闭合,那么,我们就可以放心的去传入我们的SQL代码了。

我们接下来就要去查询SQL语句向
该表查询了多少字段,这里使用Order by语句,为后面的联合查询做准备,因为联合查询需要有相同的字段数。
我传入了order by 1,页面回显正常,那么我们继续,order by 1,2,页面依旧回显正常,当我再次输入order by 1,2,3时,页面回显异常,到这里,我们可以判断出当前SQL语句查询了两个字段。



通过order by知道了字段数后,我们接下来就可以进行联合查询了。
首先我们可以查询一下数据库名字,运用下面这段SQL语句
and 1=2 union select 1,database()
得到了数据库名字为maoshe

之后,我们可以尝试获取表名。
我们继续注入SQL语句
and 1=2 union select 1,table_name from information_schema.tables where table_schema='maoshe';
通过这个查询,可以查询出maoshe中的表名,我们得到了一个admin表(其实还有其他的表,但是,我只想用admin表,基本账号密码都在这个表中,但是,如果你想知道其他表名,可以使用limit,limit用法我会在后面讲到)

既然表名确定了,我们就要去猜字段了,我们继续查询。
and 1=2 union select 1,column_name from information_schema.columns where table_name='admin'
通过查询,我得到了一个id字段,但是,这并不是我们想要的结果,而且,这个表中不会仅有这一个字段。接下来,我们就要用到limit
在MySQL中,limit有一个遍历的功能(或许不叫这个名字,但我比较喜欢这样理解)
用法:limit 1,1 跳过第一个,查询后面一个。
limit 2,1跳过第二个,查询后面一个
以此类推
那么,我说到现在,你可能猜到我要怎么做了。

我们在我们上面的SQL语句中插入 limit 0,1 limit 1,1 limit 2,1来遍历字段。
我们分别得到了id,username,password字段,当然,你可以继续遍历,不过,既然得到了username和password字段,我们的目的达到了,为什么要继续遍历呢?



胜利近在咫尺,我们进行最后一步查询
我们要查询 username 和 password 字段的内容
查询username:and 1=2 union select 1,username from admin
查询password:and 1=2 union select 1,password from admin
查询到username为admin,password为hellohack


至此,封神台黑客靶场1-1顺利通关。
当然,本教程所讲为手工注入方法,同样可以使用sqlmap进行自动注入,这里就不进行介绍了。
希望大家能后喜欢本教程,后续我还会继续做其他系列,本教程中如果存在错误也欢迎指正,相互学习。