程式碼審計實戰—DWVA-sql-impossible
0x00 前言
0x01 start
1.白盒測試
impossible是說不可能的意思,所以我們就直接進行白盒測試。
先來看下關鍵程式碼:
$id = $_GET[ 'id' ];
// Was a number entered?
if(is_numeric( $id )) {
// Check the database
$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();
$row = $data->fetch();
// Make sure only 1 result is returned
if( $data->rowCount() == 1 ) {
// Get values
$first = $row[ 'first_name' ];
$last = $row[ 'last_name' ];
// Feedback for end user
$html .= "<pre>ID: {$id}<br />First name: { $first}<br />Surname: {$last}</pre>";
}
}
1.1 首先使用is_number來判斷輸入
首先檢測是不是數字或者數字字串。
1.2 $db->prepare
準備要執行SQL語句。
1.3 POD
$data->bindParam( ':id', $id, PDO::PARAM_INT );
對資料使用了PDO技術,防止sql注入。
1.4 $data->rowCount() == 1
這裡只有是1的時候參會返回結果。成功的防止了脫庫的現象出現。