DVWA DVWA => 备份地址
SQL Injection(Blind)(sql注入 盲注) 在SQL注入过程中并不会给客户端返回查询到的内容
。
用来对程序对应的数据存储区
进行对应的探测。
盲注分类 盲注主要有两种:基于时间
,基于布尔
的盲注。
基于时间的盲注
通过向SQL中注入sleep(int x)
,观察响应时间是否有对应延迟,如果有,则数据是存储在数据库中。
例如:
1 2 3 ` select * from tableA A where A.colA = '1' # and A.colB = '2' ;select * from tableA A where A.colA = '1'
1 2 # 查询并等待5 s 1 ' and sleep(5) #
基于布尔的盲注
通过向SQL中注入and 1=1
或and 1=2
,观察响应内容是否不同,如果不同,则数据是存储在数据库中。
例如:
Low
手动测试
在注入点注入基于时间的盲注
能够观察到有明显的延迟。
在注入点注入基于布尔的盲注
能够观察到两种布尔值对应的回应不相同。
源码分析
直接从request
中获取参数(GET)
直接将参数拼接入SQL文中执行
1 2 3 $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id ';" ;$result = mysqli_query ($GLOBALS ["___mysqli_ston" ], $query );
根据查询结果返回对应页面
1 2 3 4 5 6 7 8 9 if ($exists ) { echo '<pre>User ID exists in the database.</pre>' ; } else { header ( $_SERVER [ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); echo '<pre>User ID is MISSING from the database.</pre>' ; }
Medium
High
burpsuit 测试
抓包,找到注入点
1 2 3 4 5 6 7 8 9 10 11 12 GET /dvwa/vulnerabilities/sqli_blind/ HTTP/1.1 Host : train.comUser-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0Accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language : en-US,en;q=0.5Accept-Encoding : gzip, deflateReferer : http://train.com/dvwa/security.phpConnection : closeCookie : id=2; security=high; PHPSESSID=9jcja8m0r7k7h2je6ife9ivmajUpgrade-Insecure-Requests : 1Pragma : no-cacheCache-Control : no-cache
针对Cookie: id=$2$
注入
与Low
级别相同,可得盲注结果。
源码分析
从cookie
中获取参数
1 2 3 $id = $_COOKIE [ 'id' ];$exists = false ;
将参数直接拼接入SQL执行
限制查询条数。
1 2 3 $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id ' LIMIT 1;" ;$result = mysqli_query ($GLOBALS ["___mysqli_ston" ], $query );
根据查询结果返回对应页面
与Low
级别相同。
Impossible
源码分析
通过token
验证身份
1 2 3 checkToken ( $_REQUEST [ 'user_token' ], $_SESSION [ 'session_token' ], 'index.php' );$exists = false ;
从request
中获取参数(GET)
与Low
级别相同。
以PDO
方式预编译SQL参数查询
1 2 3 4 5 6 $data = $db ->prepare ( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );$data ->bindParam ( ':id' , $id , PDO::PARAM_INT );$data ->execute ();$exists = $data ->rowCount ();
根据查询结果返回对应页面
与Low
级别相同。