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 ...
随机推荐
- navicat for mysql 12中文破解版(安装+破解)--亲测可用
http://www.ddooo.com/softdown/129457.htm#dltab
- Python中的传参是传值还是传址?
传值:在C++中,传值就是把一个参数的值给这个函数,其中的更改不会影响原来的值. 传址:即传引用,直接把这个参数的内存地址传递进去,直接去这个内存地址上进行修改. 但是这些在Python中都没有,Py ...
- Exploit-Exercises nebule 旅行日志(四)
接着上次的路程继续在ubuntu下对漏洞的探索练习,这次是level03了 先看下level03的问题描述: 精炼下问题,在/home/flag03的目录下有个crontab的文件是每分钟都在执行 这 ...
- 如何用ESP8266实现网页配置(web)
准备工作 准备一个深圳四博智联科技有限公司的ESP-F 模组.或者四博智联科技的NODEMCU 当我们拿到ESP-F模块后,可以按照以下接线进行测试: 即 VCC.EN 接 3.3v.GPIO15 G ...
- elasticsearch(4) 轻量搜索
一 空搜索 搜索API的最基础的形式是没有指定任何查询的空搜索 ,它简单地返回集群中所有索引下的所有文档: 示例 GET 127.0.0.1:9200/_search 响应 { , "tim ...
- 字符串a-b
#include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> #in ...
- io 的一些简单说明及使用
io 流简述: i->inputStream(输入流) o->outputStream (输出流) IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输, ...
- JS高德地图应用 ---- 鼠标点击加入标记 & POI搜索
代码如下 (填入Key值) : <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- vue添加页面键盘事件
我司开发项目,用的是vue+elementUI,做登陆页面的时候,点击enter键的时候要实现和点击登陆按钮一样的功能,所以就百度了一下,于是一通百度之后,就在点击按钮上面直接添加了@keyup.en ...
- sql 双表或多表的连接查询 join
使用 inner join,left join, right join.full join 对双表进行联合查询. 1.inner join.join:如果表中有至少一个匹配,则返回行. 2.left ...