目錄
這個滲透環境的搭建有以下幾點:
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...