SQL注入<一>-简单注入

题目复现

hackinglab - 最简单的SQL注入

题目地址:http://lab1.xseclab.com/sqli2_3265b4852c13383560327d1c31550b60/index.php

查看源代码有个提示(其实没啥用)

4

意思是说用户名为admin,这题非常简单就不多说了,用户名直接输入admin’#‘ or 1=1#等就行,构造SQL语句

1
2
select * from admin where username='admin'#' and password='123456'或
select * from admin where username='' or 1=1#' and password='123456'

得到flag:iamflagsafsfskdf11223

实验吧 - 登陆一下好吗??

题目链接:http://www.shiyanbar.com/ctf/1942

打开后是一个登录框

1

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

2

发现这应该是个普通的简单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

3

得到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注入题目复现中遇到时会记录一下。