MySQL基础注入手册

之前有同学问我SQL注入的基本方法,我忽然还一时半会儿讲不清楚。才疏学浅啊,所以就把自己的一些经验和网上的资料结合一下整理个总结,我比较习惯在Evernote上写总结,奈何Evernote忽然抽风,老是保存冲突,所以就把这个号称“手册”的技术总结写在博客上,谨以此纪念我对Evernote那逝去的爱(玩笑话)~~~~

0x00 说明:

本文只是一个基础手册,对于那些高大上的注入技巧并不涉及(本人也搞不明白)~~

目标缺陷代码:

很典型的GET注入,用户可以控制代码中where语句中的判断内容。

0x01 基本篇:

payload格式:

从左到右,aaa后面的单引号用于闭合在原始sql语句中aaa前面的单引号,最后的引号用于闭合原sql语句中aaa后面的引号,“– ”是注释符。and 1=2恒为flase,用于封闭原sql语句的输出,union后面是实质会显示结果的sql查询,因为union语句规定前后的sql语句选取的字段数必须相等,所以这了除了字段名“user”以外还填充了两个常量“1”,“2”,最后的“limit 0,1”用的“0”于变换查询结果在表中的位置,如果需要整张表的结果可以从0遍历到最大值,“1”决定查询的行数,这个值需要结合具体情况设定。

所以当用户这样输入后,原SQL语句就变成了:

对于查询的字段数,由于在实战情况下是不知道代码内sql语句的形态的,所以需要尝试以确定这个值。

尝试猜测原sql语句的字段数:

“1,2,3,4”是填充的常量,长度需要根据实际情况遍历,直到页面中能完整输出“1,2,3,4…”为止。

利用order by语句递增,mysql中在order by语句中可以用数字指代前面被选择的字段(按顺序),所以可以尝试不断递增直到报错或无输出为止,即可知最大的一个无报错值就是字段数

获取主机信息:

获取用户信息:

用户信息存在于mysql系统库的user表中,user字段存储用户名和对应的主机名,password表中是hash后的密码(这类操作需要root权限)。

获取当前DBMS上的库名:

库名信息存在于mysql系统库的db表和information_schema系统库的schemata表中,分别存在的字段是db和schema_name。

已知库名获取表名:

表名信息存储在information_schema系统库的tables表中,其中table_schema字段与table_name字段表示库名与表名的对应关系。

获取所有表名:(个人认为不实用)

查询某库某表的内容:

读取文件:

0x02 Bypass篇:

在常规的SQL注入中可能会有目标程序本身的过滤功能或者WAF阻止某些关键字,Bypass的原则就是替代或改变某些关键字的写法,让这些过滤失效。

大小写混杂:

因为SQL不区分大小写,所以对于某些黑名单过滤表可能会漏掉某些关键字的变换形式。

拼写混杂:

有些过滤器是采用去除某些关键字的策率来实现过滤的,故可以利用这一点将拼写混杂。

这个pyaload本身是无法正常执行的,但如果过滤器把“union”,“select”,“from”,“limit”关键字去掉后就变成了可以执行的payload了。

Hex编码:

MySQL是支持将16进制的数字按ACSII自动解析成字符串的,但是也仅限于解析字符串(比如where语句里面的判断),像“select”这类的关键字不支持解析,Hex编码适合过滤了单引号的场合。

0x746573746462等价于’testdb’。

URL编码:

某些情况下黑名单过滤器并没有考虑某些关键符号在URL编码后的形态,所以可以把单引号替换成%27,左括号替换成%28,右括号替换成%29以实现bypass。这种情况比较普遍,所以有些聪明点的过滤器会将URL先解码后在进行过滤判断,但这样反而可能聪明反被聪明误,我们可以把关键字做两次URL编码。

payload中所有的单引号都被两次URL编码,当过滤器解开第一层编码后这个payload。

CHAR函数:

CHAR函数用于将十进制ASCII码拼接成字符串,用途和Hex编码一样。

反引号:

反引号可以用来包裹SQL语句中的变量名,其功能初衷是防止表名,列名等和SQL关键字重和时发生冲突,用反引号来标示变量。

“tanble_name”被加了反引号,但不影响功能。

注释:

在MySQL中可以使用“/**/”来进行注释,但如果注释的格式是“/*!select*/”那么实际上注释内的部分依然会被解析。

这对于某些正则表达式过滤可能会有用。

空格填充:

对于空格的部分,可以用注释来填充。

也可以用“.”和“+”替代空格。

Leave a Reply

Your email address will not be published. Required fields are marked *