萬能密碼的SQL注入漏洞其PHP環境搭建及防禦手段

2022-09-20 10:30:12 字數 3658 閱讀 2222

目錄

這個滲透環境的搭建有以下幾點:

1、建立資料庫指令碼

在mysql中使用source命令即可執行指令碼:

drop database if exists lab;

create database lab;

use lab;

create table users

( id int not null auto_increment,

username char(32) not null,

passcode char(32) not null,

primary key(id)

);insert into users(username,passcode) values('admin','admin123');

insert into users(username,passcode) values('alice','alice456');

2、登入介面html

login

3、查詢資料庫是否為正確的賬號密碼php**

<?php include('con_database.php');

$username=isset($_post['username'])?$_post['username']:'';

$password=isset($_post['password'])?$_post['password']:'';

if($username=='' || $password=='')

$sql="select * from users where username='$username' and passcode='$password'";

$query=mysqli_query($con,$sql) or die('sql語句執行失敗'.mysqli_error($con));

if ($row=mysqli_fetch_array($query))else

mysqli_close($con);

?>

4、連線資料庫php**:

<?php $con=mysqli_connect('127.0.0.1','root','root') or die("資料庫連線失敗!");

mysqli_select_db($con,'lab')or die("資料庫連線失敗");

?>

5、登出登入**(即關閉session會話)

<?php session_start();

session_unset();

session_destroy();

echo "登出成功";

?>

6、登入成功歡迎介面

<?php session_start();

if(isset($_session['username']))else

?>

至此,我們的滲透環境就構建好了

當然登入方法不止一種:

原來查詢語句是這樣的:

$sql="select * from users where username='$username' and passcode='$password'";

經過注入之後,變成:

$sql="select * from users where username='' or 1=1 or ' and passcode='****'";

我們觀察到,where後面呃字句中的username被閉合,並且字句分成三個句子並用or連線。

在sql語句中 and的優先順序要大於or,所以1=1先判斷,為真,即where後面的語句為真,即整個sql語句為真,即表示查詢正確

而形成的語句可以將整個users表查詢,後面的$row=mysqli_fetch_array($query)選擇的是查詢的第一行值,這樣滿足了sql語句並跳過了登入驗證

由此可以引申出,只要where後面字句為真,即可跳過驗證,有如下衍生方法:

1、使用正規表示式限制使用者輸入

可以使用正規表示式限制使用者的使用者名稱輸入,比如:/^[a-z0-9a-z_]$/

這個限制了使用者5位以上16位以下的字母數字下劃線為使用者名稱的輸入

這個限制在check_login.php中新增

<?php include('con_database.php');

$username=isset($_post['username'])?$_post['username']:'';

$password=isset($_post['password'])?$_post['password']:'';

if (!preg_match("/^[a-z0-9a-z_]$/",$username))

$sql="select * from users where username='$username' and passcode='$password'";

$query=mysqli_query($con,$sql) or die('sql語句執行失敗'.mysqli_error($con));

if ($row=mysqli_fetch_array($query))else

mysqli_close($con);

}?>

2、使用php轉義函式

$username=isset($_post['username'])?addslashes($_post['username']):'';

$password=isset($_post['password'])?mysqli_real_escape_string($con,$_post['password']):'';

3、轉義函式的弊端

因為使用的是utf-8編碼,不是寬位元組編碼,形成的'會被變成%5c%27

windows下預設的是寬位元組的gbk編碼

如果在%5c前面加上乙個字元形成乙個複雜的漢字,那麼單引號仍然會被輸出

在使用引數化查詢的情況下,伺服器不會將引數的內容是為sql指令中的一部分

而是在資料庫完成sql指令的編譯之後,再代入引數執行

此時就算引數裡面有惡意資料

但是此時sql語句以及編譯完成

就不會被資料庫執行

php提供了三種訪問mysql資料庫的拓展:

pdo和mysqli提供物件導向的api

mysqli也存在面向過程的api,所以容易從mysql轉換到mysqli

下面是mysqli形式的check_login.php 寫法,新建check_login_mysqli.php

<?php include('con_database.php');

$username=isset($_post['username'])?$_post['username']:'';

$password=isset($_post['password'])?$_post['password']:'';

if($username==''||$password=='')

$sql="select * from users where username=? and passcode=? ;";//問號表示需要乙個引數

$stmt=$con->prepare($sql);//預編譯sql語句

if(!$stmt)

elseelse

$stmt->close();

}$con->close();

?>

一些內容已經標記在**的注釋裡面

引數化的php**真的能夠很有效地防止sql注入。

phpmyadmin 萬能密碼漏洞

基本2.x.x 版本,空密碼也能登入phpmyadmin localhost 查了下,基於mysql 資料庫許可權的漏洞造成 缺省會有乙個user 為 空的帳號 localhost mysql u p 直接能進資料庫,把這個帳號刪除就ok了 drop user localhost 或者公升級高版本的...

BBSXP最新漏洞 簡單注入檢測 萬能密碼

bbsxp最新漏洞 漏洞日期 2005年7月1日 受害版本 目前所有bbsxp 漏洞利用 查前台密碼注入語句 blog.asp?id 1 20union 20select 201,1,userpass,username,1,1,1 20from 20 user 20where 20membercod...

SQL萬能密碼原理

萬能密碼的原理 使用者進行使用者名稱和密碼驗證時,需要查詢資料庫。查詢資料庫就是執行sql語句。針對此bbs論壇,當使用者登入時,後台執行的資料庫查詢操作 sql語句 是 select user id,user type,email from users where user id 使用者名稱 an...