sql注入
sql注入的起源就不说了,但由于不同的数据库有不同的语法和函数,所以,不一定方法是通用的,但是基本方向是一致的。
sql注入最重要的一点是判断注入点,一般由’ , ", )等来判断,当然有奇葩的另说了。简单的通过一个’号就可以判断出注入点,前提是有错误回显,没有的话就得不断的尝试,与正确页面相比较来判断注入点。
在注入的时候,会发现经常有些字段被屏蔽,或者是程序会过滤这些特殊字段,像空格,union,select,union select等,这就是所谓的waf。可以通过burp suite来查看哪些字段过滤了。怎么绕过被过滤的字段网上有很多,请自行查找。这里给一个博客的链接,认为内容比较全。
http://www.cnblogs.com/Vinson404/p/7253255.html
盲注
盲注是因为没有我们想要的答案的回显。
报错注入
报错盲注的要求是会回显数据库的错误信息。
贴一个通用的盲注写法:
select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))
当然有时候程序会屏蔽一些东西,要改版这条语句。
基于布尔的盲注
基于布尔的盲注不会有任何回显,一般通过脚本来实现注入。
贴一个盲注的语句。
1’ and mid(database(),1,1)=‘a’ --+
成功则是正确页面,失败就是错误页面,通过这个来判断数据库,表,列,最后得到内容。
基于时间的盲注
这个和布尔盲注差不多,通过时间来检验错对。
1’ and mid(database(),1,1)=‘a’ and sleep(5) --+
如果对了睡5秒,错误就跳过。
双重注入
双重注入只能说程序用的执行sql语句的函数可以执行多条sql语句。
这样我们用;来结束上条语句在写下一条语句。
1’ ; create table likes users;
会建一个和users一样的表,当然这里我们后面可以写改密码啊,创建用户啥的。
非盲注
基于union的注入
基于union的注入是最简单的注入,要求必须有正确答案的回显。
通过union select 来合并查找我们要的东西。
最后想说的是,sql注入基本方式就是这些,但是如何找到注入点是最难的,不同的语言,不同的函数都有不同的底层构造,有的函数会有bug,像php的sprintf漏洞等。需要我们去积累,并不停的尝试,灵活应用这些知识来达到注入。
如有任何问题,请评论。