1.代码审计
<?php
session_start();
include('config.php');
if(empty($_SESSION['name'])){
show_source("index.php");
}else{
$name=$_SESSION['name'];
$sql='select pass from user where name="'.$name.'"';
echo $sql."<br />";
system('4rfvbgt56yhn.sh');
$query=mysqli_query($conn,$sql);
$result=mysqli_fetch_assoc($query);
if($name==='admin'){
echo "admin!!!!!"."<br />";
if(isset($_GET['c'])){
preg_replace_callback("/\w\W*/",function(){die("not allowed!");},$_GET['c'],1);
echo $flag;
}else{
echo "you not admin";
}
}
}
?>
根据代码提示,我们可以知道需要登陆admin账户且通过传递参数c来获取flag。
2.sql约束攻击
题目给出了提示,注册和登陆的地址。这里要我们admin账户登陆,那么我们先注册一个admin的账户。
他这里说不能等级admin账户。登陆界面试了好像不能注入。
这里用到sql的一个规则。
在SQL中执行字符串处理时,字符串末尾的空格符将会被删除。也就是说我注册admin+空格账户在执行sql时相当于注册了admin账户。
那么我们通过注册admin+空格账户,登陆admin账户时使用我们注册的admin+空格账户的密码即可登陆admin。具体有关sql约束攻击可以阅读:基于约束的sql攻击。
3.正则绕过
最后就是c参数的preg_replace_callback("/\w\W*/",function(){die("not allowed!");},$_GET['c'],1);
的绕过。
\w匹配任何单词字符包含下划线 ===>等价于 [A-Z a-z 0-9_]
\W匹配任何非单词字符 (与上面的相反) ===>等价于 [^A-Z a-z 0-9_]
同时过滤了单词字符与非单词字符,但是这里没有对c参数进行非空限制,我们传递一个空格即可绕过。
得到flag。