ToB企服应用市场:ToB评测及商务社交产业平台

标题: CTF Web SQL注入 10000字详解 [打印本页]

作者: 农妇山泉一亩田    时间: 2024-9-3 09:02
标题: CTF Web SQL注入 10000字详解
涉及的数据库知识

union

团结查询:将两条SQL语句的结果一起输出
语法:select语句1 union select语句2
使用条件:前后两个语句的查询结果的字段数相同
order by

结果排序:该函数本来用于将查询结果排序
语法:select * from table_name order by column_name
通过order by遍历字段序号可以得到原有查询语句输出结果有几个字段
database()

输出当前数据库的库名
information_schema

information_schema为体系自带的数据库
里面有一个tables表,该表存放着数据库和数据表的关联,其中table_schema为存储数据库名的字段,table_name为存储表名的字段
select table_name from information_schema.tables where table_schema=database()会输出当前数据库中的所有表名
另有一个columns表,该表存放着数据表和字段的关联,使用该表查询某表中有哪些字段时,需要同时指定是哪个数据的哪个表
select column_name from information_schema.columns where table_name='admin'and table_schema=database()会输出指定命据表中的所有字段名
limit

用于分页
语法:select * from table_name limit n,m;
n表示从第n行开始,m表示取m条数据
--空格解释

碰到引号如 select * from user where id='$id'
可以先将前面的引号闭合,再将背面的引号用 -- qwe解释掉
比方如下的payload
  1. 2' union select 1,table_name,3 from information_schema.tables where table_schema=database() -- qwe
复制代码
此处的qwe只是为了演示出–背面的空格,并无现实意义
replace

用于更换字符串
语法:REPLACE (String,from_str,to_str)
将String中所有出现的from_str更换为to_str
into outfile

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中,常用于创建表的备份复件或者用于对记录进行存档。
在 SELECT 查询语句中使用 INTO OUTFILE 参数可以将查询结果保存到文本文件中。
语法:SELECT ... INTO OUTFILE 'file_name'
如果题目条件允许,可以实行show variables like '%secure_file_priv%'来查看允许导出结果的目录,MySQL服务只允许在这个目录中实行文件的导入和导出操作。
like

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式
现在,我们希望从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:
我们可以使用下面的 SELECT 语句:
  1. SELECT * FROM Persons
  2. WHERE City LIKE 'N%'
复制代码
提示:% 可用于定义通配符(模式中缺少的字母)
常见通配符:% 表示可有零个或多个恣意字符; _ 表示需要一个恣意字符;
GROUP BY

GROUP BY 语句用于联合聚合函数(如 COUNT()、MAX() 等),根据一个或多个列对结果集进行分组。
GROUP BY 可以共同聚合函数一起使用,通过使用聚合函数,在分组之后可以对组内结果进行计数(COUNT)、求和(SUM),求均匀数(AVG)操作等。
GROUP BY会先按照指定字段的值是否相同来将数据分组
更加具体的介绍可以看下面这篇:
GROUP BY与COUNT用法详解_group by count_鲲鹏之上的博客-CSDN博客
HAVING

HAVING 子句可以筛选通过 GROUP BY 分组且聚合后的各组数据。
聚合函数(avg、sum、max、min、count),不能作为条件放在where之后,但可以放在having之后
GROUP BY、HAVING、WHERE之间的关系

在语句的位置上,where在group by前, having在group by 之后
在实行顺序上,以下面这个SQL语句为例
  1. select city ,count(*) as num from staff  where age> 19 group by city having num >= 3;
复制代码
以是实行顺序为:WHEREGROUP BY聚合函数HAVING
regexp

REGEXP的基本语法如下:
  1. column_name REGEXP pattern
复制代码
这里,column_name 是要搜索的列,pattern 是正则表达式模式。
regexp表达式可以放在where背面作为查询的限制条件,也可以搭配if或者case,作为条件语句
原理

SQL注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行实行,从而导致数据泄露,丢失甚至服务器瘫痪。如果代码中没有过滤或者过滤不严谨是会出现毛病的。
SQL注入攻击的本质,是把用户输入的数据当做代码实行
SQL注入的条件是可控变量和可带入数据库查询
信息网络

操作体系

数据库

判断注入点

如果测试注入点时页面返回404,则大概率没有注入点
注入点类型

POST注入

POST和GET注入的区别就是注入点位置发生了变化,在欣赏器中已经无法直接进行查看与修改。
POST注入高危点:网页中的登录框、查询框等各种和数据库有交互的框
手动POST注入一般使用burpsuite工具进行抓包
使用sqlmap自动进行POST注入有两种方法
可以使用--forms对页面的表单进行测试
也可以先用burpsuite抓包,并将数据包保存,然后使用-r 数据包目录对数据包中的POST注入点进行分析
数字型注入

数字型注入是指在一个期望数字的输入位置注入SQL代码。由于数字型数据通常不需要引号困绕,以是注入相对简单。比方,一个基于数字的 SQL 注入可能在一个像这样的查询中实现:
  1. SELECT * FROM users WHERE id = [input]
复制代码
如果正常输入为 1,那么查询变为 SELECT * FROM users WHERE id = 1。如果输入为 1 OR 1=1,则查询变为 SELECT * FROM users WHERE id = 1 OR 1=1,这将返回所有效户的数据,由于 1=1 总是真。
字符型注入

字符型注入发生在处理字符串数据的查询中。攻击者必须闭合开放的字符串(使用引号),然后注入额外的 SQL 代码。比方:
  1. SELECT * FROM users WHERE username = '[input]'
复制代码
正常输入可能是 alice,查询为 SELECT * FROM users WHERE username = 'alice'。如果输入是 '; DROP TABLE users; --,那么查询就酿成了 SELECT * FROM users WHERE username = ''; DROP TABLE users; --',这会尝试删除整个 users 表。
搜索型注入

搜索型注入通常出现在搜索功能中,特别是当查询设计成模糊匹配用户输入时。比方:
  1. SELECT * FROM products WHERE name LIKE '%[input]%'
复制代码
这种环境我们仍然可以只闭合前面的引号
Insert/update/delete注入

当页面中存在修改账号信息、注册账号、删除账号等操作时,究竟上就是存在插入、修改数据库数据的操作
insert型注入相关的sql语句形式 INSERT INTO table_name VALUES (值1, 值2,....)或者INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
update型注入相关的sql语句形式: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
delete型注入相关的sql语句形式:DELETE FROM 表名称 WHERE 列名称 = 值
这些类型的注入点由于没有select语句,以是适合使用
HEADER注入

HEADER注入通过修改请求报文中的请求头部(head)来进行注入。
PHP中通常使用**$_SERVER**数组来网络请求头信息
手动HEAD注入可以使用burpsuite工具进行抓包
Order By注入

当我们的注入点在SQL语句的Order By关键字之后时,通例的团结注入无法实现,由于通常回显的内容是前半段语句
那么我们可以考虑使用报错注入和盲注
针对Order By关键字,可以使用rand()函数来构造布尔盲注的条件
由于rand(0)和rand(1)返回的内容差别,我们可以将判断语句放在rand中,这样布尔值差别,回显的结果也差别
固然也可以使用时间盲注,不外由于查询的条数比较多,以是延时时间最好设短一些
闭合方式

闭合

在注入毛病中,构造payload语句的精华之一在于闭合
差别的场景下我们需要通过猜测源码中的SQL语句、试验差别的方法来构造闭合
转义符号报错得到闭合方式

如果步伐开启了sql语句的报错信息,可以尝试利用转义符号报错得到闭合方式
当原语句的闭合字符碰到转义字符时,会被转义,那么没有闭合符的语句就不完整了,导致报错,通过报错信息我们就可以推断出闭合符。
payload示比方下
?id=1\
使用表达式来判断是否带括号及引号类型(实用无报错)

测试?id=2'%26%26 '1'='1和?id=2"%26%26 “1"="1这两个payload

这种判断方法比较适合在步伐关闭了报错信息的环境下使用
时间盲注遍历闭合方式

由于时间盲注的场景中,页面没有任何回显,我们只能通过延时时间来判断正确的闭合方式
  1. ?id=1' and sleep(5) --+
  2. ?id=1" and sleep(5) --+
  3. ?id=1') and sleep(5) --+
  4. ?id=1')) and sleep(5) --+
  5. ?id=1") and sleep(5) --+
复制代码
解释

通例环境下一般是通过在payload的末了加上解释符,将后半段语句整个解释掉
SQL语句中的解释符还是挺多的
注入手段

团结查询

团结查询主要是运用SQL的union语法
将需要实行的语句与原语句使用union拼接在一起
判断字段数

从order by 1开始一直到order by n,观察是否有查询结果,用来判断当前数据表有多少字段
判断字段数可以使用二分法,先判断1和一个大数n,若n无显示则判断n/2
判断命据显示位

若 注入语句-1 union select 1,2,3,而页面只输出2
阐明第二个字段为当前页面的输出点(显示位),数据库只输出该字段上的内容
这里使用-1使之前的语句查询无结果,即空查询,则显示的时候就会显示union之后的第二条语句。
报错注入

报错注入 (Error-based injuction),就是利用数据库的某些机制,人为地制造错误条件,使得查询结果可以大概出现在错误信息中
当代码中使用die(mysql_error())来返回错误信息时,我们可以使用报错注入
XPATH报错注入

通过输入非法路径来导致XPATH syntax error
extractvalue(arg1,arg2)

接受两个参数,arg1:XML文档,arg2:XPATH语句
条件:mysql5.1及以上版本
标准payload:and extractvalue(1,concat(0x7e,(select user()),0x7e))
返回结果:XPATH syntax error.’~root@localhost~’
updatexml(arg1,arg2,arg3)

arg1为xml文档对象的名称,arg2为xpath格式的字符串;arg3为string格式更换查找到的符合条件的数据
条件:mysql5.1.5及以上版本
标准payload:and updatexml(1,concat(0x7e,(select user()),0x7e),1)
返回结果:XPATH syntax error:’~root@localhost~’
布尔盲注

**布尔盲注(Boolean-based Blind SQL Injection)**属于SQL注入的一种形式。其主要原理是通过向数据库发送特制的SQL查询语句,根据应用步伐的差别相应(通常是真或假)来推断数据库中的信息。布尔盲注不直接显示数据库中的数据,而是通过观察应用步伐对注入恶意SQL语句的相应来推测数据。
注入流程

布尔盲注夸大一个字,以是每次我们只能从返回的布尔值获取有关数据库的某一项信息
比方通过length()函数来判断字符串的长度,通过substr()或substring()逐个试出字符串中的每个字符
固然,我们想要获取数据库中的某个数据,肯定是要从库、表、字段逐步来获取信息
下面是常见的注入流程:

常用函数


payload示例

以数据库这一层为例,我们需要得到数据库名称的长度,然后求数据库名称中有哪些字符
首先获取长度,我们可以使用二分法,先选一个较大的数,将其与leng'r'h的值进行比较
  1. ?id = 1 and (length(database())<8) --+
  2. ?id = 1 and (length(database())>8) --+
复制代码
如果长度小于8,则再与4进行比较
获取数据库名时,以left()函数为例
  1. -- 从左至右截取一个字符
  2. ?id = 1 and (left(database(),1)='s') --+
  3. -- 从左只有截取两个字符
  4. ?id = 1 and (left(database(),2)='se') --+
复制代码
时间盲注

时间盲注是指基于时间的盲注,也叫延时注入,根据页面的相应时间来判断是否存在注入。
使用场景

时间盲注使用的优先级并不高,通常是在团结注入、报错注入、布尔盲注都无法使用时才会考虑使用:
判断注入点

依次尝试以下类型的测试payload,延时5秒以上则阐明判断成立,即存在注入
  1. ?id=1 and if(1,sleep(5),3) -- a
  2. ?id=1' and if(1,sleep(5),3) -- a
复制代码
if(1,sleep(5),3) 是一个条件表达式,其中 1 总是真(由于1在逻辑上代表真),因此实行 sleep(5),这使得数据库暂停5秒。
IF语句基本语法如下
  1. IF(condition, true_value, false_value)
复制代码

宽字节注入

原理

计算机底层由二进制存储数据,差别的编码映射着差别的二进制数据,我们以8位二进制为单字节,也称标准字节。宽字节指比标准字节有更多的字节
常见的单字节编码:ASCII
常见的宽字节编码:GB2312,GBK,GB18030,BIG5等
以GBK为例,它以2个字节进行编码
服务端对用户输入的敏感数据(主要是单双引号等特别字符)进行了转义,如利用mysql_real_escape_string()或addslashes()等函数
它会将用户输入的/?id=1'转换为/?id=1\'·,这样的目的是为了防止sql注入构造闭合.
此时我们可以使用宽字节注入来摧毁转义,固然前提是PHP发送请求到MySql时使用了语句SET NAMES 'gbk' 或是set character_set_client =gbk 进行了一次编码
当转义使用的\为ASCII编码,而客户端传入的参数被当成GBK等宽字节编码,则可以通过在\之前插入一个十六进制字节(ASCII码要大于128,才到汉字的范围)来让mysql以为插入的字节和\是一个中文字符,从而吃掉\,摧毁转义。
毛病发现

示例

好比使用%df'会被PHP当中的addslashes函数转义为“%df\' 。
\ 即url里面的%5c , '对应的url编码是%27,那么也就是说,%df\' 会被转义%df%5c%27
倘若网站的字符集是GBK,mysql使用的编码也是GBK的话,就会认为%df%5c%27是一个宽字节。
%df%5c会联合(由于宽字节是占两个字节),也就是縗。背面就有一个 ’,这样就能乐成构造注入语句。
二次注入

原理

在第一次进行数据库插入数据的时候,后端仅仅只是使用了 addslashes 或者是借助get_magic_quotes_gpc 对其中的特别字符进行了转义,但在存入数据库时还是原来的数据,数据中一般带有单引号和#号,然后下次使用在拼集SQL中,以是就形成了二次注入。
示例

堆叠注入

原理

在堆叠注入中,攻击者通常会使用分号(;)将多条SQL下令分隔开来。这种方法的乐成实行依赖于后端数据库管理体系的支持,由于并非所有的数据库体系都支持一次实行多个查询。
同时也并非什么环境下都能使用堆叠注入,比方PHP中的mysql_query函数不支持实行多个语句,而mysqli_multi_query函数则允许在一个调用中实行多个SQL语句
由于页面的回显通常只会展示第一个语句的结果,以是背面那些语句适合实行一些非查询的SQL语句操作
示例

下面罗列了一些堆叠注入中可能用到的SQL操作
特别场景

md5()函数

题目中可能会计算暗码的md5值来比对
$password = md5($_POST['password'],true);
我们需要相识一下md5()函数中,设置true参数有什么用
string md5( string $str[, bool $raw_output = false] )

那么当我们输入的password参数内容在计算md5哈希值后,会将哈希值根据转为原始二进制数据的字符串
此时我们可以通过精心构造输入,比方ffifdyop
它在颠末md5函数后会得到'or'6�]��!r,��b

那么就可以作为万能暗码来使用
例题:ctfshow平台的web187
弱类型比较

PHP 是一种弱类型语言,它在比较数字和字符串时会进行类型转换

SQL中,类型转换规则依赖于使用的数据库体系,但大多数数据库管理体系(如 MySQL)也体现出肯定的弱类型特征:
数字和字符串比较少时,字符串会转换为数字,如0==admin,那么如果输入的username是0,则会匹配所有开头不是数字或者为0的字符串和数字0
例题:ctfshow平台的web188

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4