bugku 26 ~ 27write up(web)

一、第26题(过狗一句话)

bugku 26 ~ 27write up(web)
打开链接发现一篇空白,抓包也没什么发现。那么我们只能分析上面那段代码了
explode()函数就是把$poc变量用#号来分割开来。那么$poc_2就是assert,他和最后一句代码构造成了assert()函数,assert函数功能跟eval类似,可以把里面的内容当作代码来执行。

那么我们构造payload为?s=print_r(scandir('./')),扫描出描本级目录下的文件。(这其实是一种xss攻击)
bugku 26 ~ 27write up(web)
发现了flag_sm1skla1.txt文件。访问该文件即可得出flag
bugku 26 ~ 27write up(web)
拓展:
我们扫描上级目录

http://123.206.87.240:8010/?s=print_r(scandir(%27../%27))

bugku 26 ~ 27write up(web)
根据目录结构应该是linux系统,hosts文件应该在etc里面

http://123.206.87.240:8010/?s=print_r(readfile(%27../etc/hosts%27))

bugku 26 ~ 27write up(web)

一、第27题(字符?正则?)

打开题目,是一段代码

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?> 

分析这段代码可以发现,只要我们构造出一个符号条件的KEY作为参数传入即可得到flag,突然发现我的正则学了和没学一样。

这边先介绍下

preg_match — 执行一个正则表达式匹配

preg_match ( $pattern , $subject , $matches )

搜索subject与pattern给定的正则表达式的一个匹配.

参数 :

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

返回值 :

preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。

实例1:

$label = 'content/112';
$a = preg_match('#content/(\d+)#i', $label, $mc);
var_dump($a);
var_dump($mc);
输出:

int(1)
array(2) {
 [0]=>
 string(11) "content/112"
 [1]=>
 string(3) "112"
}

开始分析下题目中的正则表达式
定界符:/和/(一般来说是这两个,其实除了\和字母数字其它的只要是成对出现都可以看做定界符,比如##、!!之类的);

. (一个点):表示可以匹配任何字符;

*   :前面的字符重复零次或多次;

{n,m} :最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 4 到 7 个任意字符;

\ (反斜线):后面的字符被转义;

[a-z] :在a到z中匹配 ;

[[:punct:]] :匹配任何标点符号;

/i  :表示这个正则表达式对大小写不敏感;

我们构造id=keykeyaaaakey:/a/keyz;
bugku 26 ~ 27write up(web)