SQL手工注入

折腾了两天终于对sql注入有基本的思路了,先从手工注入理解原理,后续再继续学习sqlmap,很大一部分前辈写的挺好的我就不重复了→→http://blog.csdn.net/emaste_r/article/details/8156108

一,总体思路

1.找注入点 → 2.猜解表名 → 3.猜解列名 → 4.暴出字段内容
猜解表名时先试试imformation_schema数据库是否被禁用,没有被禁用的话就方便了~ 直接用union select的方法搜索系统表imformation_schema就可以显示出全部的表名,列名之类的了
下面说一说上面博客没有讲到的一种暴字段内容的方法,部分sql注入实战时会有不显示任何数据的情况(这种情况还要数据库搜索啥!!),就要用到类似exists猜解表名的方法挨个猜解字段内容的ASCII码,从而得出字段内容(一般也不会手工猜,累死了,这种情况直接上sqlmap工具)。

二,ASCII码猜解内容方法

成功猜解表名,列名后 →
1.猜解字段长度,在注入点输入: and (select top 1 len (列名) from 表名)>5 ,正常显示原内容页面则长度+1继续猜测,直到显示错误则得知字段内容长度 ,select top 1就是搜索该列第一个字段内容,根据需要换数字。
2.猜解字段内容,在注入点输入: and (select top 1 asc(mid(列名,i,1)) from 表名)>97 ,后面数字97表示猜测的ascii码,asc()为ASCII编码显示,mid(s,i,1)为在s字符串中第i位取出1个。逐位猜解从而得到字段内容(够麻烦吧)。

三,实战技巧

一般网站都会对输入内容进行过滤,接上来上实战手工注入中常用到的技巧
1.mysql有种语法 /*!语句*/ 相当于没有注释(好奇怪的语法),部分网站对or,and,select之类的语句过滤后可以尝试 /*!and*/ /*!union*/ /*!select*/ 这样的写法。对应实验吧里的这个注入题→→ http://www.shiyanbar.com/ctf/1875
2.使用双写法绕过过滤,select被过滤可以尝试写成selecselectt,把中间的select过滤后依然可以前后组成一个select。
3.使用URL编码绕过对 ’ 字符的过滤,把写 ’ 的地方写成 %27 ,对空格的过滤可以写成 + 进行尝试
4.利用sql语句的=号从左往右运算的特性,例如select * from user where username='miaomiaomiao'='' and password='miaomiaomiao'=''数据库中没有username=’miaomiaomiao’则结果为0,然后继续判断0=”,返回值1,语句就变成了select * from user where 1。对应实验吧→→http://www.shiyanbar.com/ctf/1942 ,感谢pcat大神的WP详细的思路~

你可能感兴趣的:(网络安全)