题目复现
hackinglab - 最简单的SQL注入
题目地址:http://lab1.xseclab.com/sqli2_3265b4852c13383560327d1c31550b60/index.php
查看源代码有个提示(其实没啥用)

意思是说用户名为admin,这题非常简单就不多说了,用户名直接输入admin’#或‘ or 1=1#等就行,构造SQL语句
1 | select * from admin where username='admin'#' and password='123456'或 |
得到flag:iamflagsafsfskdf11223
实验吧 - 登陆一下好吗??
题目链接:http://www.shiyanbar.com/ctf/1942
打开后是一个登录框

直接查看源码发现没有什么提示,既然是SQL注入,那就username输入‘ or 1=1#password随便输试下

发现这应该是个普通的简单SQL注入,把输入的数据和数据库中数据对比,所以可以猜测后台SQL判断语句大概是
1 | select * from user where username='username' and password='password' |
看下输入‘ or1=1#后页面返回内容,发现or和#被过滤掉了,也就是说带or的SQL语句应该是不能用了而且不能通过注释把username后面注释绕过了。那就要使where后面条件恒为真绕过登陆了,使username和password执行结果为true,所以可以输入1’=’0(0去掉是一样的)等,为什么呢?
看下输入之后SQL语句变为
1 | select * from user where username='1'='0' and password='1'='0' |
在sql语句中,=号的比较是从左向右进行比较的,那么两句话在第一个等号比较之后的结果就返回false也就是0(username数据库中不会为1,所以1换成其他字符也是一样的),接下来再和后面的’0’比较就为真返回1,同理password也是,那么SQL语句就变成了select * from user where 1 and 1。
所以用户名密码都输入1’=’0

得到flag:ctf{51d1bf8fb65a8c2406513ee8f52283e7}
SQL注入类型
上面两题都是简单的闭合注释,通过这两题了解下SQL注入是什么是干嘛的。下面写下SQL注入的类型
按照注入点类型来分类
1、数字型注入
当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。这一类的 SQL 语句原型大概为 select * from 表名 where id=1,测试步骤:
(1) 加单引号,URL:www.xxx.com/xxx.php?id=1
对应的sql:select * from table where id=1’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常。
(2) 加and 1=1 ,URL:www.xxx.com/xxx.php?id=1 and 1=1
对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面无任何差异。
(3) 加and 1=2,URL:www.xxx.com/xxx.php?id=1 and 1=2
对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异。
如果满足以上三点,则可以判断该url存在数字型注入。
2、字符型注入
当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。这一类的 SQL 语句原型大概为select * from 表名 where name=’admin’,测试步骤:
(1) 加单引号:select * from table where name=’admin’’
由于加单引号后变成三个单引号,则无法执行,程序会报错;
(2) 加 ’and 1=1 :select * from table where name=’admin’ and 1=1’
也无法进行注入,还需要通过注释符号将其绕过;
Mysql 有三种常用注释符:
– 注意,这种注释符后边有一个空格
# 通过#进行注释
/ /注释掉符号内的内容
因此,构造语句为:select * from table where name =’admin’ and 1=1#’ 可成功执行返回结果正确;
(3)加and 1=2–:select * from table where name=’admin’ and 1=2 –’
则会报错
如果满足以上三点,可以判断该url为字符型注入。
3、搜索型注入点
这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,这一类的 SQL 语句原型大概为select * from 表名 where 字段 like ‘%关键字%’,测试:
%’ union select 1,2,3,4 and ‘%’=’
按照数据提交的方式来分类
1、GET 注入
提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。
2、POST 注入
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
3、Cookie 注入
HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
4、HTTP 头部注入
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。
按照执行效果来分类
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
*5、堆查询注入,可以同时执行多条语句的执行时的注入。
等等…
SQL注入基本步骤
1、判断是什么类型注入,有没有过滤关键字,是否能绕过
2、确定存在注入的表的列数以及表中数据那些字段可以显示出来
3、获取数据库版本,用户,当前连接的数据库等信息
4、获取数据库中所有表的信息
5、获取某个表的列字段信息
6、获取相应表的数据
关于SQL注入的知识还有很多很多,比如SQL注入过程需要用到的语法、函数等,这些在之后的SQL注入题目复现中遇到时会记录一下。