1. 程式人生 > >PHP的sql注入(密碼是md5加密的)

PHP的sql注入(密碼是md5加密的)

2018年6月20日記錄:
在實驗吧做了一道關於後臺登陸的題目,之前自己對php注入方面認識的不是很好,所以一直對注入這方面談虎色變,今天做了一下,其實自己好好分析整個過程,發現並不是特別難的,難得只是不敢動手去做:
我看到這個問題的時候一看網址:

http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php

沒有檔案包含的意思(最近被打擊,總是想著確認一下),然後是正兒八經的php站點,想著肯定是涉及到注入了,點選了輸入框,查看了一下原始碼,找到了後臺資料庫的查詢程式碼:

 $password=$_POST['password'];
    $sql
= "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'"; $result=mysqli_query($link,$sql); if(mysqli_num_rows($result)>0){ echo 'flag is :'.$flag; } else{ echo '密碼錯誤!'; }

分析了一下,emm。。。一看就是POST,是提交查詢,注入的了。
分析了下程式碼,在一個位置發現對我們輸入的密碼進行了md5加密:
password = '".md5($password,true)."'";


這個時候我是真的不知道了,因為我是菜雞,所以就在網上搜索了下關於md5的知識,發現一個字串加密之後,在經過md5解密後會形成新的字串。那麼這個樣子的話,我們如何構造一個字串使它加密解密之後和我們判斷有沒有php注入點的式子一樣的話正好就可以呀!
再看後面的程式碼,只是判斷了返回回來的結果的行數是否是大於零的:

$result=mysqli_query($link,$sql);
        if(mysqli_num_rows($result)>0)

說明正好有戲!
後面參見了一篇文章,說到我們尋找這樣字串的時候其實並不是特別容易,他給出了一個字串,解密加密之後正好可以和我們判斷的式子一樣可以達到相同的查詢結果就是:ffifdyop

——-> ‘or’6
然後我一看,不對啊,怎麼個連結給的php地址的名字是一樣的呀,這才想到了出題人的良苦用心呀,答案就在眼前,自己不好好注意!就這樣,這道題就這樣解決了。

拓展知識(萌新的我,苦呀,emm。。。。):
PHP:

mysqli_query():

命令用來執行鍼對資料庫的查詢,有三個引數,

  1. connection(必須,用來建立一個規定的Mysql連結)
  2. query(必須,用來查詢的字串)
  3. resultmode(可選引數)

返回值:對於SELECT,DESCRIBE,EXPLAIN,SHOW的查詢,返回值是一個mysqli_result結果,對於其他查詢成功的語句,返回的是TRUE或者FALSE。

mysql_num_rows() :

用來返回結果集中行的數目。
有一個引數:
1. data(必須,用來執行結果集,從mysql_query中呼叫的到)

  • mysql_num_rows() 返回結果集中行的數目。此命令僅對 SELECT 語句有效。要取得被 INSERT,UPDATE 或者 DELETE 查詢所影響到的行的數目,用 mysql_affected_rows()。
    如果使用 mysql_unbuffered_query(),則直到結果集中的所有行都被提取後 mysql_num_rows() 才能返回正確的值。*