[HCTF 2018]WarmUp 1
1 |
|
这题是简单的绕过,我们主要了解函数
mb_substr(x1,x2,x3),这个函数用于截取字符串,x1是字符串,x2是起始位置,x3是截取个数。
mb_strpos(x1,x2),这个函数用于查找字符在字符串中的位置,x1是字符串,x2是什么字符。
include函数有这么一个神奇的功能:以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。
payload:?file=hint.php?../../../../../ffffllllaaaagggg
[GXYCTF2019]Ping Ping Ping(空格绕过)
这题是命令执行
我们主要了解空格过滤绕过
1 | ${IFS}$9 |
读源码
1 | /?ip= |
1 | else if(preg_match("/.*f.*l.*a.*g.*/", $ip)) |
这里flag必须按照顺序出现,中间可以插入任意字符。我们可以用变量替换来绕过这种简单的过滤。
payload:?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
[SUCTF 2019]EasySQL(PIPES_AS_CONCAT)
我们注入万能钥匙‘’ or 1=1发现返回的是nonono
猜测是or被过滤了,我们可以使用bp爆破来看哪些关键字被过滤了。
最后发现prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|”
都被过滤了那么联合注入,报错注入,盲注啥的都不能用了,但还有一个堆叠注入。
1 | 1;show databases; |
那么确实可以用堆叠注入。
进行尝试后,发现只有当输入是非零数字的时候有回显,而0或字符的时候是无回显的,那么我们可以猜测有||运算符,这个运算符在mysql里是或运算,在其他大部分的数据库中是字符连接符号。
源码中确实有**$sql = “select “.$post[‘query’].”||flag from Flag”;**
1 | select command1 || command2 |
方法一:使用 sql_mode 中的 PIPES_AS_CONCAT 函数。
PIPES_AS_CONCAT:将 || 或运算符 转换为 连接字符,即将||前后拼接到一起。
注意:select 1 || flag from Flag的意思将变成 先查询1 再查询 flag,而不是查询1flag,只是查询的结果会拼接到一起
payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
方法二:
select * , 1 || flag from Flag
这个代码会查询Flag中的所有内容。
[极客大挑战 2019]Upload
知识点1
1 | php短标签 |
知识点2
文件头绕过
知识点3
php3 php4 phtml 都会被当成php解析
[极客大挑战 2019]BabySQL
知识点1
select查询语句中查数据库的便捷操作
1 | select flag from ctf.Flag |
这是从ctf库中的Flag表查flag字段
[bugku] sqli-0x1
知识点1
/**/这样的注释可绕过过滤union select这样的过滤机制
1 | union/**/select |
[RoarCTF 2019]Easy Calc
知识点1(php解析机制)
这题我们是用get方法传参,但是传的参数只能是字母,因为在注释中说了有waf,如果输入字母会有
我们这时可以这样绕过:
1 | calc.php?num=phpinfo() #这是原来的传参 |
这是因为在参数还没传入后端的时候有个waf会先检查num中的值,这里我们在num前面加上空格实际的参数名就会变成“空格num“这时waf就不能识别参数名,那么输入字符也就不会被拦截,但当参数传到后端的时候,php的参数解析机制会去除参数中的一些特殊字符包括空格,换行符什么的,这样参数名就还是原来的num,这样就不会影响识别。
知识点2
chr()代替字符进行绕过
知识点3
var_dump,scandir(),file_get_contents()函数的使用
[BJDCTF2020]Easy MD5
知识点1
md5($pass,true)
PHP中md5函数如果第二个参数设为true,返回的是二进制内容
知识点2
只要’or’后面的字符串为一个非零的数字开头都会返回True
知识点3(ffifdyop)
ffifdyop在被md5加密后返回的二进制内容会被php识别为'or'6<trash>
(因为mysql会把二进制内容解释为ASCII码)
(<trash>
其实就是一些乱码和不可见字符,这里只要第一位是非零数字即可被判定为True,后面的<trash>
会在MySQL将其转换成整型比较时丢掉)
知识点4(md5弱比较)
方法一(0e开头的)
由于弱比较之前都会先转化成相同的类型,而0e都会被视为科学计数法,0的多少次方都是0,所以只要0e开头的字符串就行,这里列举几个
1 | QNKCDZO |
方法二(数组)(强比较也可以用)
md5()函数无法识别数组,所以会返回NULL,如果俩都是NULL,那么条件也是相等的。