SQL注入学习(一)
注入攻击的本质:web应用程序没有过滤用户输入或过滤不严谨,直接把用户输入的恶意数据当做代码执行
两个条件:
1.用户能够控制输入
2.原本程序要执行的代码,拼接了用户输入的数据
注入类型
SQL注入
把SQL命令插入到web表单的输入域或页面请求的查询字符串,欺骗数据库服务器执行恶意的SQL命令
命令注入
后端未过滤掉恶意数据,代码当做系统命令执行
代码注入
文件包含
反序列化漏洞
LDAP注入
XML注入
XXE:引用外部实体时,构造恶意内容,导致读取任意文件,执行系统命令,探测内网端口,攻击内网网站等危害
Xpath:与SQL注入类似,XPath解析器本身对URL,表单中提交的代码内容未做严格限制,导致恶意代码可以直接解析执行
Xquery
JSON注入:轻量级的数据交换格式,主要利用特殊字符注入JSON中造成解析失败
JSONP注入:回调函数未作严格的检测和过滤
危害:
绕过登录验证:登录网站后台
获取敏感数据:获取管理员账号与密码
文件系统操作:列目录,读取,写入文件
注册表操作:读取,写入,删除注册表
执行系统命令:远程执行命令
判断一个HTTP请求是否存在SQL注入的方式存在
经典: and 1=1 | and 2>1 | or 1=1 | or 1<1
数据库函数 and sleep(4)=1 | and length(user())>3
特殊符号 单引号或双引号
注入分类
数字型注入
输入的参数为整数,如果存在注入型漏洞,则为数字型注入
测试方法:
And 1=1 运行正常 And 1=2 运行异常
字符型注入
输入的参数为字符串
与数字型的区别在于:字符型注入一般要使用单引号来闭合
测试方法:
' and '1' = '1 运行正常
' and '1' = '2 运行异常
搜索型注入
主要是指在进行数据搜索时没过滤搜索参数
一般在连接地址中有"keyword=关键字" 有的不显示连接地址,而是直接通过搜索框表单提交
此类注入点提交的SQL语句,其原型大致为:
Select * from 表名 where 字段 like '%关键字%'
造成SQL注入的原因
1.动态字符串构建引起
不正确地处理转义字符(宽字节注入)
不正确地处理类型(报错泄露信息)
不正确地联合查询
不正确地错误(报错泄露信息)
不正确地多次提交(二次注入)
2.后台存在的问题
后台无过滤或者编码用户数据
数据库可以拼接用户传递的恶意代码
3.错误处理不当
详细的内部错误消息显示给用户或攻击者
错误信息可以直接给攻击者提供下一步攻击帮助
4.不安全的数据库配置
默认账户:
1.SQL Server "sa"作为数据库系统管理员账户
2.MySQL使用"root"和"anonymous"用户账户
3.Oracle则在创建数据库时通常会默认创建SYS/SYSTEMS/DBSNMP/OUTLN账户
手工注入过程
1.判断是否存在注入点
2.判断字符长度
3.判断字段回显位置
4.判断数据库信息
5.查找数据库名
6.查找数据库表
7.查找数据库表中所有字段及字段值
8.猜解账号密码
9.登录管理员后台
寻找SQL注入
GET注入
POST注入
Cookie注入
Host注入
User-Agent注入
****
挖掘SQL注入
使用逻辑进行确认
OR 1=1
OR 1=2
AND 1=1
AND 1=2
测试字符串 | 变种 | 预期结果 |
---|---|---|
' | 触发错误,如果成功,数据库将返回一个错误 | |
1' or '1'='1 | 1') or('1'='1 | 永真条件,如果成功,将返回表中所有的行 |
value' or '1'='2 | value') or ('1'='2 | 空条件,如果成功,将返回与原来的值相同的结果 |
1' or 'ab'='a'+'b | 1') or ('ab'='a'+'b | SQL Server字符串连接。如果成功将返回永真条件相同的信息 |
1' or 'ab'='a' 'b | 1') or ('ab'='a' 'b | Mysql字符串连接,如果成功,将返回与永真条件相同的信息 |
1' or 'ab'='a'丨丨'b | 1') or ('ab'='a'丨丨'b | Oracle字符串连接,如果成功,将返回与永真条件相同的信息 |
识别数据库
1.盲跟踪 -->web应用技术、不同数据库SQL语句差异
2.非盲跟踪 -->报错、直接查询
数据库|注释 |描述 |
|--|--|--|
|SQL Server与Oracle |--(double dash) |用于单行注释
| |/* /|用于多行注释
|MySQL|--(double dash)|用于单行注释。要求第二个dash后跟一个空格或控制字符(如制表符、换行符等)
||#|用于单行注释
||/ /|用于多行注释
*
关于数据库版本的查询**
|数据库|参数 |
|--|--|
|MSSQL |select @@version |
|MySQL|select version()/select @@version|
|Oracle| select banner from $version|
|Postgresql|select version()|
从两个不同的表中提取数据
SELECT column-1,column-2,...column-N FROM table-1
UNION
SELECT column-1,column-2,...column-N FROM table-2
如果允许重复的值,就要使用UNION ALL
SELECT column-1,column-2,...column-N FROM table-1
UNION ALL
SELECT column-1,column-2,...column-N FROM table-2
匹配列
UNION SELECT NULL,NULL,NULL,... //直到匹配对应列时返回为真
ORDER BY 3,ORDER BY 4,ORDER BY 5,... //当列数小于或者等于当前列的时候返回正常
例如:
http://test/?id=' union select 1,2,3--
http://test/?id=1 ' order by 1--
http://test/?id=1 ' order by 2--
http://test/?id=1 ' order by 3--
常见手工注入SQL语句
查看数据库
union select 1,(select group_concat(schema_name)from information_schema.schemate),'3
查看security库数据表
union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),'3
使用条件语句
IF condition THEN do something ELSE do something else
数据库服务器 | 查询 |
---|---|
Microsoft SQL Server | IF ('a'='a') SELECT丨ELSE SELECT 2 |
MySQL | SELECT IF('a',1,2) |
Oracle | SELECT CASE WHEN 'a'='a' THEN 1 ELSE 2 END FROM DUAL SELECT decode(substr(user,1,1),'A',1,2) FROM DUAL |
PostgreSQL | SELECT CASE WHEN(1=1) THEN 'a' else 'b' END |
SQL注入学习(一)的更多相关文章
- SQL注入学习资料总结
转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html 什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Lang ...
- sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)
(整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...
- SQL学习之SQL注入学习总结
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 测试数据库 我们本文就以如下数据库作为测试数据库,完成我们的注入分析 ...
- sql注入学习笔记 详解篇
sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...
- SQL注入学习-Dnslog盲注
1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...
- 从零开始的sql注入学习(挖坑不填)
首先,本人是小白,这篇文章也只是总结了一下大佬们的sql注入方法,要是有错,请各位大佬指出,以便学习. 虽然我是菜鸡,但是太过基础的sql注入问题也就不再重复的解释了.直接从常用的说起. 实战中常用的 ...
- 简单sql注入学习
sql注入是什么? 所谓SQL注入,就是通过把SQL命令插入到Web表单提 交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQ ...
- Java SQL注入学习笔记
1 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 2 JDBC 介绍 JDBC: 全称 Java Databa ...
- sql注入学习心得与sqlmap使用心得
做题是最好的老师 首先先来分享一下我用来练手的题目,实验吧中的简单的sql注入1,2,3 不得不说,sql注入真是一个神奇的东西,至少我以前看起来一点头绪都没有的题目能入手了 首先是简单的sql注入3 ...
随机推荐
- netty解码器详解(小白也能看懂!)
什么是编解码器? 首先,我们回顾一下netty的组件设计:Netty的主要组件有Channel.EventLoop.ChannelFuture.ChannelHandler.ChannelPipe等. ...
- python 生成器(generator)的生成方式
generator包括生成器和带yield的generator函数. 写了一个生成杨辉三角的小例子: # -*- coding:utf-8 -*- def triangles(): l = [1] w ...
- flink基础教程读书笔记
数据架构设计领域发生了重大的变化,基于流的处理是变化的核心. 分布式文件系统用来存储不经常更新的数据,他们也是大规模批量计算所以来的数据存储方式. 批处理架构(lambda架构)实现计数的方式:持续摄 ...
- python 游戏 —— 汉诺塔(Hanoita)
python 游戏 —— 汉诺塔(Hanoita) 一.汉诺塔问题 1. 问题来源 问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆 ...
- 页面制作学习笔记:D1.概述
一.Web发展历史 Web1.0 :早期HTML页面:例:网易的门户网站163.com. Web2.0:AJAX技术规模应用:例:网易邮箱126.com. Web3.0:HTML5技术规模应用:例:网 ...
- 了解box-sizing 盒子模型
最近看到别人代码有用到box-sizing属性,自己没用过,记录一下 box-sizing:border-box 指定宽度和高度(最小/最大属性)确定元素边框box 理解:假设宽高为100px,设置了 ...
- 闪付卡(QuickPass)隐私泄露原理
0×00 前言 说到闪付卡,首先要从EMV开始,EMV是由Europay,MasterCard和VISA制定的基于IC卡的支付标准规范.目前基于EMV卡的非接触式支付的实现有三个:VISA的payWa ...
- MySQL最基本的概念梳理
本文根据<MySQL必知必会>(Ben Forta著,2009)整理,基于MySQL4.1-5,可作为深入研究MySQL之前的漱口篇.(基本语句.正则表达式.联结.全文本搜索.增删改查.存 ...
- python 操作手机
https://blog.csdn.net/wave_1102/article/details/41630469 import os import time import subprocess i = ...
- WPF: 在ListView中添加Checkbox列表
描述:ListView是WPF中动态绑定工具的数据容器,本文实现了一个在ListView中显示的供用户选择的列表项目,并且控制列表中选择的项目数量,即实现单选. XAML中创建ListView,代码如 ...