你帮我一次,我记你终生。
前言:
记录一些题,继续学习。主要记录自己不懂得或忘记的,写的不好,还请谅解。
如想查看完整的writeup,可参考:
GBK Injection
1.记录此题,主要学习关于宽字节注入。
原理:在GBK
编码时,mysql
会认为两个字符是一个汉字(在前一个字节的ascii码大于128的情况下)。而经过转义之后的单引号'
会变为\'
,即%5c%27
。构造id=1%df%27%23
,在经过转义传递给mysql
时,就是id=1%df%5c%27%23
,mysql在解析时,会认为%df%5c
是一个汉字,而%27
就会闭合掉原本sql语句中的(左)单引号,即select xxx from xxx where id='%df%5c'#'
,%23
用于注释掉原本sql语句中的(右)单引号。这就是宽字节注入的原理。
2.构造注入:
先查看数据库:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27 union select null,database()--+
得sae-chinalover
然后查表:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
这个比较过分,有5个表:ctf,ctf2,ctf3,ctf4,news
因为引号被过滤,按常规的注入,得绕很多。这里猜测flag字段为flag
,然后一个一个表查,发现是在表ctf4
语句为:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%d6%27 union select 1,(select flag from ctf4) --+
更换表名查即可。
参考:
/x00
1.这是一道很纯粹的代码审计题,提示说了有多种做法,故记录一下。
这是给出的源码:
view-source:
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
2.分析:
-
@eval
:@
的作用就是忽略报错信息 -
ereg()
函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的 PHP 函数 ereg() -
strpos()
函数: 返回字符串在另一个字符串中第一次出现的位置,如果没有找到该字符串,则返回 false PHP strpos() 函数
3.如何绕过:
这里传入的nctf
要用nctf[]
,构造一个数组,传入之后,ereg()
返回NULL
。===
判断NULL
和FALSE
,是不相等的,所以可以进入第二个判断。strpos()
处理数组时,也是返回NULL
,NULL!==FALSE
,条件成立,拿到flag
其实,在等与不等这块,自己感觉有些混乱了,因为NULL==FALSE
,应该也是成立的。所以检查了一下:
发现确实是相等的,相当于他们是恒等的,PHP的弱类型比较真是可怕。
4.趁此机会,复习一下弱类型比较:下图写的是函数strcmp()
和md5()
存在的弱类型问题,可通过这些问题进行相关绕过。
5.最后,直接附上看到的几篇关于PHP弱类型的文章:
上传绕过
1.遇到这题,说实话,心里想到的是:所有跳过的坑,都得补回来。
之前做Bugku的时候遇到的文件上传,那个题也是不会,看了别人的writeup后,以为文件上传不难,匆匆地过了。现在想来,真是井底之蛙。
2.此题,先上传了一个jpg文件,发现提示如下:
3.再传个php试试:
对比上图,发现过滤机制是检查扩展名(当扩展名不通过时,上传不了)仔细查看上传后的文件位置,发现存于./uploads
目录下。
4.既然不许上传php文件格式(上传时过滤)又要求上传为php格式文件(上传到服务器后检验),那只能从提示的信息中想办法绕过了。从上面的信息中,知道上传的文件在./uploads
目录下,将文件名存于basename
字段中,并且通过分割文件名和扩展名来检验,因此,应该是通过extension
字段来进行识别。
5.现在,需要做的就很明确了,上传的文件名应该被截断,分成两部分,把.php
的部分存于basename
中,后面的.jpg
不可进入,否则无法绕过。所以,使用0x00
截断.php
后的字符:
6.在burpsuite中进行修改,如图:
然后修改:
变成:
得到flag:
7.上面写的有些繁琐,主要为了学习文件上传的知识,下面是相关知识的学习:
关于截断:
关于文件上传:看了下面几篇文章后,说实话,有的没有看懂。此时,方知关于此知识点的运用真是各式各样,看来只能多实践才能慢慢掌握。