SQL(pikachu)
SQL Inject漏洞概述
在owasp发布的top 10漏洞里面,注入漏洞一直是危害排名第一,其中主要指 SQL Inject漏洞
数据库注入漏洞,主要是开放人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。
SQL Inject漏洞攻击流程
1、第一步:注入点探测 —— 自动方式:使用web漏洞扫描工具,自动进行注入点发现 —— 手动方式:手工构造sql inject测试语句进行注入点发现 2、第二步:信息获取 通过注入点期望得到的数据。 —— 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。 —— 2.数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解) 3、第三步:获取权限 —— 获取操作系统权限:通过数据库执行shell,上传木马
SQL Inject漏洞 - 常见注入点类型
- 数字型 —— user_id=$id
- 字符型 —— user_id= ‘$id’
- 搜索型 —— text LIKE ‘%{$_GET[‘search’]}%’"
SQL Inject - 数字型注入(pikachu)
$id $_POST['id']
select 字段1,字段2 from 表名 where id = $id;
select 字段1,字段2 from 表名 where id = 1 or 1 = 1;
SQL Inject 漏洞代码分析(数字型)
if(isset($_POST['submit']) && $_POST['id']!=null){
$id=$_POST['id'];
$query="select username,email from member where id=$id";
$result=execute($link, $query);
if(mysqli_num_rows($result)>=1){
while($data=mysqli_fetch_assoc($result)){
$username=$data['username'];
$email=$data['email'];
$html.="<p class='notice'>hello,{$username} <br />your email is: {$email}</p>";
}
}else{
$html.="<p class='notice'>您输入的user id不存在,请重新输入!</p>";
}
}
SQL Inject - 字符型注入(pikachu)
$username=$_GET['username']
select 字段1,字段2 from 表名 where username='kobe';
~~kobe or 1=1~~
select 字段1,字段2 from 表名 where username='kobe' or 1=1
SQL Inject 漏洞代码分析(字符型)
if(isset($_GET['submit']) && $_GET['name']!=null){
$name=$_GET['name'];
$query="select id,email from member where username='$name'";
$result=execute($link, $query);
if(mysqli_num_rows($result)>=1){
while($data=mysqli_fetch_assoc($result)){
$id=$data['id'];
$email=$data['email'];
$html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
}
}else{
$html.="<p class='notice'>您输入的username不存在,请重新输入!</p>";
}
}
SQL Inject - 搜索型注入(pikachu)
select * from member where username like '%k%';
like '%xxxx%' or 1=1
%xxxx%' or 1=1 #
= ('xx')or 1=1 #')
xx')or 1=1
SQL Inject 漏洞代码分析(搜索型)
$name=$_GET['name'];
$query="select username,id,email from member where username like '%$name%'";
$result=execute($link, $query);
if(mysqli_num_rows($result)>=1){
$html2.="<p class='notice'>用户名中含有{$_GET['name']}的结果如下:<br />";
while($data=mysqli_fetch_assoc($result)){
$uname=$data['username'];
$id=$data['id'];
$email=$data['email'];
$html1.="<p class='notice'>username:{$uname}<br />uid:{$id} <br />email is: {$email}</p>";
}
}else{
$html1.="<p class='notice'>0o。..没有搜索到你输入的信息!</p>";
}
if(isset($_GET['submit']) && $_GET['name']!=null){
$name=$_GET['name'];
$query="select id,email from member where username=('$name')";
$result=execute($link, $query);
if(mysqli_num_rows($result)>=1){
while($data=mysqli_fetch_assoc($result)){
$id=$data['id'];
$email=$data['email'];
$html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
}
}else{
$html.="<p class='notice'>您输入的username不存在,请重新输入!</p>";
}
}
总结
不管是什么型,总而言之,就是对SQL中的各种类型的输入进行闭合测试,构造合法SQL,欺骗后台执行!
补充:MYSQL小知识:注释符号
因为在SQL注入测试中,需要经常对多余的内容进行消除,以保证SQL语句语法正确,比如上面的#。 使用注释符号直接对多余内容进行注释是比较有效的方法。
MySQL服务器支持3种注释: 1.从 '#' 字符从行尾。 2.从 '--' 序列到行尾。请注意 '--'(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如:空格、tab、换行等等)。该语法与标准SQL注释语法稍有不同。 3.从 /* 序列到后面 */ 序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行。 4.下面的例子显示了3种风格的注释:
mysql> SELECT 1+1;
mysql> SELECT 1+1;
mysql> SELECT 1 + 1;
mysql> SELECT 1+ 1;
注入方式get&post区别
GET 方式中使用URL提交注入数据; POST 方式中使用抓包工具修改post数据部分提交注入;
不管是 GET方式还是 POST方式,都可能会出现SQL注入漏洞,本质其实是一样的!
以上是我的听课及学习笔记,欢迎借鉴交流学习,并指出不足!谢谢支持!
|