第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 实验吧--拐弯抹角

实验吧--拐弯抹角

时间:2023-04-06 22:01:06

相关推荐

实验吧--拐弯抹角

<?php// code by SEC@USTCecho '<html><head><meta http-equiv="charset" content="gbk"></head><body>';$URL = $_SERVER['REQUEST_URI'];//echo 'URL: '.$URL.'<br/>';$flag = "CTF{???}";$code = str_replace($flag, 'CTF{???}', file_get_contents('./index.php'));$stop = 0;//这道题目本身也有教学的目的//第一,我们可以构造 /indirection/a/../ /indirection/./ 等等这一类的//所以,第一个要求就是不得出现 ./if($flag && strpos($URL, './') !== FALSE){$flag = "";$stop = 1; //Pass}//第二,我们可以构造 \ 来代替被过滤的 ///所以,第二个要求就是不得出现 ../if($flag && strpos($URL, '\\') !== FALSE){$flag = "";$stop = 2; //Pass}//第三,有的系统大小写通用,例如 indirectioN///你也可以用?和#等等的字符绕过,这需要统一解决//所以,第三个要求对可以用的字符做了限制,a-z / 和 .$matches = array(); preg_match('/^([0-9a-z\/.]+)$/', $URL, $matches);if($flag && empty($matches) || $matches[1] != $URL){$flag = "";$stop = 3; //Pass}//第四,多个 / 也是可以的//所以,第四个要求是不得出现 //if($flag && strpos($URL, '//') !== FALSE){$flag = "";$stop = 4; //Pass}//第五,显然加上index.php或者减去index.php都是可以的//所以我们下一个要求就是必须包含/index.php,并且以此结尾if($flag && substr($URL, -10) !== '/index.php'){$flag = "";$stop = 5; //Not Pass}//第六,我们知道在index.php后面加.也是可以的//所以我们禁止p后面出现.这个符号if($flag && strpos($URL, 'p.') !== FALSE){$flag = "";$stop = 6; //Not Pass}//第七,现在是最关键的时刻//你的$URL必须与/indirection/index.php有所不同if($flag && $URL == '/indirection/index.php'){$flag = "";$stop = 7; //Not Pass}if(!$stop) $stop = 8;echo 'Flag: '.$flag;echo '<hr />';for($i = 1; $i < $stop; $i++)$code = str_replace('//Pass '.$i, '//Pass', $code);for(; $i < 8; $i++)$code = str_replace('//Pass '.$i, '//Not Pass', $code);echo highlight_string($code, TRUE);echo '</body></html>';

函数解释:

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

把字符串 “Hello world!” 中的字符 “world” 替换为 “Shanghai”:

<?phpecho str_replace("world","Shanghai","Hello world!");?>

$code = str_replace($flag, 'CTF{???}', file_get_contents('./index.php'))

file_get_contents() 把整个文件读入一个字符串中。这句话的意思是将打开的文件中的flag替换为CTF{???}。

2.strpos() 函数查找字符串在另一字符串中第一次出现的位置。

strpos(string,find,start)

3.$matches = array(),array() 函数用于创建数组,初始化数组并赋值给变量。

4.preg_match 函数用于执行一个正则表达式匹配。

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

$pattern: 要搜索的模式,字符串形式。$subject: 输入字符串。$matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。

以上是官方的解释在这里先举一个例子:

$pattern = '/^(http:\/\/)?([^\/]+)/i';$subject = '/index.html';preg_match_all($pattern,$subject,$match);var_dump($match);

array (size=3)=> array (size=1)=> string '' (length=18)=> array (size=1)=> string 'http://' (length=7)=> array (size=1)=> string '' (length=11)

数组中第一个 m a t c h s [ 0 ] 就 是 整 个 matchs[0]就是整个 matchs[0]就是整个pattern匹配到的文本元素

$matchs[1] 匹配到的是子组 (http://) 匹配到的文本

$matchs[2] 匹配到的是子组(^/+) 匹配到的文本

matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本。在正则中,()代表模式:匹配 pattern 并获取这一匹配。

5.substr

substr() 函数返回字符串的一部分。

我们审计完毕代码之后发现代码最关键的一步是:

if(!$stop) $stop = 8;echo 'Flag: '.$flag;echo '<hr />';

这段代码就是说如果!$stop为1,那么就输出flag。也就是说 $stop这个变量为0,既然为0也就是说上面的if语句中的条件都不能成立。

地址栏:8888/indirection/

题目的意思就是通过改变地址栏访问index.php,但是限制了条件不能使用 ./ …/ \ 而且只能使用小写字母,不可以在php后加点,这里我们可以利用伪静态技术,使用:8888/indirection/index.php/index.php,index.php后的index.php会被当做参数处理,所以服务器只会解析第一个index.php,满足条件成功绕过。

URL重写,其实就是把带一大堆参数的url,变成一个看上去很规矩的url,主要目的是为了搜索引擎。

举例

/viewthread.jsp?id=1234

/viewthread.jsp?id=1235

/viewthread.jsp?id=1236

重写后,可以用

/viewthread/1234.htm

/viewthread/1235.htm

/viewthread/1236.htm

补充:

伪静态页面是静态URL与动态URL互通的一个桥梁,它是指动态网址通过URL重写的手段去掉其动态参数,使URL静态化,但在实际的网页目录中并没有重 写URL。简单来说,伪静态URL就是通过服务器转换伪装文件名或地址,使该页面类似于静态页面,但服务器上没有独立存在的文件,其本质还是动态页面。

URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的URL,这样的网址可以更好的被网站所阅读。

前端中使用路径 / ./ …/ …/…/ …/…/…/ 的含义

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。