CTF的入门学习笔记一
CTF从入门到放弃
宽字节注入
URL转码
空格 %20
‘ %27
# %23
\ %5C
(PHP4,PHP5,PHP7)
addslashes函数-使用反斜线引用字符串
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线
\的作用就是转义,让一些符号失去符号特有的作用,变为普通的字符
如何从addslashes函数逃逸出来
1/\前面再加一个(或单数个).变成\‘,这样\被转义了’逃出了限制
2.把\弄没
宽字节注入原理:
宽字节注入是利用mysql的一个特性,mysql再使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascio码要大于128,才到汉字的范围)
‘ -> ' -> %5C%27
%df ‘ -> %df ' -> %df%5c%27
手工注入表名:
union select 1,group_concat(table_name) from information_schema.tables where table_schema=’库名’%23
可以用database()全局变量去代替需要输入的库名
union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23
手工注入列名
union select 1,group_concat(column_name) from information_schema.columns where table_name=’表名’%23
可以用十六进制来代替表名部分就不需要加上’’符号了
union select 1,group_concat(column_name) from information_schema.columns where table_name=0x(表名转换为十六进制)%23
关于sqlmap的小技巧:
如果表名需要用hex绕过就要在语句中加入参数-hex -D可以指定要进行注入的数据库
约束条件的安全测试
例如字符长度限制为30,那么创建一个字符串为31的用户,第31位会被自动删减,那么就可以创建一个admin 1这样的用户,然后系统会自动把1删除掉,在我们登陆admin的时候,输入的密码就可以是上面创建的
admin 1的密码,存在约束条件的注入
公式:
and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
rand()用于生产一个0~1的随机数
floor()向下取整
rand()函数生成0~1的函数,使用floor函数向下取整,值是固定的”0”,我们将rand*2,得到的值就是不固定的”0”或者”1”
select count(*) from table1 group by floor(rand()*2);
select count(*) from table2 group by floor(rand()*2);
select count(*) from table3 group by floor(rand()*2);
两条数据报错,一条数据不报错,是随机在这三条数据中报错的,并不是固定的
select floor(rand(0)*2) from information_schema.tables;
select floor(rand()*2) from information_schema.tables;
两条语句输出的结果的前几条都是一样的
rand函数中不加0是随机报错的,加零就是必两报错
报错和数据量是有关系的,然后就是rand,rand本身就是产生序列
group by floor(rand(0)*2) -> (0,1)
group by 1是不行的,她认为1是常量,
推测:
从select floor(rand(0)*2) from table可以看到再一次多记录的查询过程中floor(rand(0)*2)的值是定性的,为011011,应该就是floor(rand(0)*2)被计算多次导致的
1.查询前默认会建立空虚拟表
2.取第一条记录,执行floor(rand(0)*2),发现结果为0(第一次计算),查询虚拟表,发现0的键值不存在,则floor(rand(0)*2)会被再次计算一次,结果为1(第二次计算),插入虚表,这是第一条记录
3.查询第二条记录,再次计算floor(rand(0)*2),发现结果为1(第三次计算),查询虚表,发现1的键值存在,所以floor(rand(0)2)不会被计算第二次,直接count()加1,第二条记录查询完毕,查询完毕
floor(rand(0)*2),它会给一个返回值,而不是固定值
4.查询第三条记录,再次计算floor(rand(0)*2),发现结果为0(第四次计算),查询虚表,发现键值没有0,则数据库尝试插入与1条新的数据,在插入数据时floor(rand(0)*2)被再次计算,作为虚表的主键,其值为1(第五次计算),然而1这个主键已经存在于虚拟表中,而新计算的值也为1(主键键值必须唯一),所以插入的时候就直接报错了
推测:
由于没有加入随机因子,所以floor(rand()*2)是不可测的,因此在两条数据的时候,只要出现下面情况,即可报错
updatexml函数:
or updatexml(1,concat(0x7e,(version())),0) updatexml第二个参数需要的是Xpath格式的字符串.输入不符合,因此报错
updatexml的最大长度是32位的.
其他:
and extractvalue(1, concat(0x7e,(select database())));
and exp(~(select * from(select user())a));
虽然输入的不符合要求导致报错,但是可以执行其中的语句
并不是每个报错都可以带出数据的
NAME_CONST():
select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))a;
利用数字重复性
但是如果将语句中的version()换成database()的话也会报错,但是不会产生相应的信息
burp中自带一些爆破字典
文件上传
代码没有对访客提交的诗句进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验
上传方式
- 直接上传webshell
- 绕过客户端检测上传webshell
- 绕过服务端文件扩展名检测上传webshell
- 绕过服务端MIME类型检测上传webshell
- 绕过文件内容检测上传webshell
- 绕过服务端目录路径上传webshell
- 利用服务器漏洞上传webshell
- 利用.htaccess文件上传webshell
上传工具
- Burpsuite
- 菜刀,冰蝎,蚁剑
- 一句话木马,图片木马
MIME类型检测绕过:
image/jpeg,image/png,image/gif
服务端是通过检测这个MIME类型的,用burp抓包直接改就可以绕过了
服务器检测,检测文件头
不同的图片文件都有不同文件头,如:
PNG:文件头标识(8 bytes)89 50 4E 47 0D 0A 1A 0A
JPEG:文件头标识(2 bytes)0xff, 0xd8 (SOI)(JPEG文件标识)
GIF:文件头标识(6 bytes) 47 49 46 38 39(37) 61
PHP使用getimagesize函数验证图片文件头
文件后缀名绕过:(黑名单)
名单检测:一般有一个专门blacklist文件,里面会包含常见的危险脚本文件
绕过方法
- 找黑名单扩展名的漏网之鱼 - 比如asa和cer之类
- 可能存在大小写绕过漏洞 - 比如aSp和pHp之类
文件后缀名绕过:(黑名单)
配合操作系统文件命名规则:(服务器特性)
- 上传1.php(或者图片马),抓包改为1.php.
- 上传1.php(或者图片马),抓包改为1.php::$DATA
- 上传1.php(或者图片马),抓包改为1.php:1.jpg
- 上传1.php(或者图片马),抓包改为1.php::$DATA……
- 上传1.php(或者图片马),抓包改为1.php[空格]
htaccess解析漏洞:
- 首先上传一个.htaccess内容如下的文件:SetHandler application/x-httpd-php
- 上传一个可以上传的文件,会直接当作php文件直接执行的
00阶段绕过上传
- %00截断绕过白名单
- %00快捷键ctrl+shift+u完成
- PHP版本低于5.3.29,且GPC关闭下是可以突破的
图片马上传:
制作图片教程
copy 1.jpg/b+2.php/a 1.jpg
参数/b指定一二进制格式复制,合并文件;用于图像类/声音类文件
参数/a指定以ASCII格式复制,合并文件.用于txt等文档类文件
Apache解析楼哦对那个,一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩张名,那么apache会尝试去解析x2,直到能够解析到能够解析的位置,或者就会报错
IIS解析漏洞
IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录包含”.asp”字符串,那么这个目录下所谓的文件都会按照asp去解析,另一个是只要文件名中含有.asp
会有优先asp来解析
Nginx解析漏洞
例如:原文件名是test.jpg.可以添加为test.jpg/x.php进行解析攻击,还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击