sql注入原理
什么是sql注入?
所谓sql注入,就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意sql命令。具体来说,它是利用现有应用程序,将sql命令注入到后台数据库引擎执行的能力,它可以通过在web表单中输入sql语句得到一个存在安全漏洞的网站上的数据库。
sql注入原理
sql注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是sql语法里的一些组合,通过执行sql语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
sql注入简单测试原理
显注
部分源码示例
$id = $_GET['id']; //获取用户提交的id参数的值
$sql = $"select * from `new` where id= " . $id; //拼接sql语句,直接获取用户输入,没有经过任何处理,存在sql注入
简单判断是否存在注入点方法
1.加单引号,即"’ ",如果不加单引号显示页面正常,加了单引号页面显示不正常或者错误。
select * from `new` where id=1'
2.加and 1=1页面显示正常,加and 1=2,页面显示不正常或错误。
select * from `new` where id=1 and 1=1 //语句永远为真
select * from `new` where id=1 and 1=2 //语句永远为假
万能密码
类似 or 1=1
select * from `new` where id=1 or 1=1
相当于 select * from new
,会返回所有数据
通过union联合查询获取其他表的内容
union可以合并两条或多条select语句的查询结果,它的语法如下:
Select column-1,column-2,…,column-N from table-1 union select column-1,column-2,…,column-N from table-2
union的限制:
1.两个查询返回的列数必须型相同。
eg:select title, content from new union select username, password from user;
2.两个select语句对应列所返回的数据类型必须是相同或者是兼容的。
ps: 实际的SQL注入应用中,一般第二个select都是用数字或者null,因为这2个类型兼容比较,null更是兼容所有类型。
so要想知道查询中列的数量,用 order by 子句来确定。order by 是根据指定的列名进行排序。(主要靠猜,猜对了有回显,猜错会报错)
下面就是爆库爆表爆数据啦
基础知识:
在SQL注入中,我们重点关注的表有如下几个,因为主要的时候主要利用这几个表来获取数据:
SCHEMATA:提供了当前mysql数据库中所有数据库的信息,其中SCHEMA_NAME字段保存了所有的数据库名。show databases的结果取自此表。
TABLES:提供了关于数据库中的表的信息,详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,其中table_name字段保存了所有列名信息,show tables from schemaname的结果取自此表。
COLUMNS:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息,其中column_name保存了所有的字段信息。show columns from schemaname.tablename的结果取自此表。
爆一个数据库名
select schema_name from information_schema.schemata limit 0,1//其原理就是通过查询information_schema.schemata中schema_name的结果,其中limit 0,1用来获取第一条记录,通过递增第一个参数,可以每次获取一条记录,也就是一次获取一个数据库名,直到出现错误为止,说明没有更多的错误。
爆表名
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = 'sqli';
爆字段名
select column_name from information_schema.columns where TABLE_SCHEMA='sqli' and TABLE_NAME='user';
知道了库名、表名、字段,如果有回显且支持联合查询,就可以直接通过在注入点后面注入一个联合查询语句,即可直接获取数据,如果不能回显,则可能需要通过盲注获取数据