一、第26题(过狗一句话)
打开链接发现一篇空白,抓包也没什么发现。那么我们只能分析上面那段代码了
explode()函数就是把$poc
变量用#号来分割开来。那么$poc_2
就是assert,他和最后一句代码构造成了assert()函数,assert函数功能跟eval类似,可以把里面的内容当作代码来执行。
那么我们构造payload为?s=print_r(scandir('./'))
,扫描出描本级目录下的文件。(这其实是一种xss攻击)
发现了flag_sm1skla1.txt文件。访问该文件即可得出flag
拓展:
我们扫描上级目录
http://123.206.87.240:8010/?s=print_r(scandir(%27../%27))
根据目录结构应该是linux系统,hosts文件应该在etc里面
http://123.206.87.240:8010/?s=print_r(readfile(%27../etc/hosts%27))
一、第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;