iT邦幫忙

1

sql injection

小弟目前再研究sql injection 的相關問題,
照著網路上的教學,發現我使用' OR 1=1 -- 還是無法駭進自己的登入系統
使用 ' OR 1=1 -- ,把$sql_login echo 出來在--後面會多一個'
SELECT account FROM admin WHERE account = '123' OR 1=1 --' AND password = ''
想請問'在--橫面不是等同於被佇解掉了嗎?那為何無法執行登入呢?
有沒有推薦的資源讓我多了解sql injection這方面的知識呢?

<?php
    require_once 'connection/connect.php';
    session_start();
?>
<?php
    if(isset($_POST['login_check']) && $_POST['login_check'] == 'login_check'){
        $sql_login = "SELECT `account` FROM `admin` WHERE  `account` = '{$_POST['account']}'  AND `password` = '{$_POST['password']}' ";
        $result_login = mysqli_query($link,$sql_login);
        $row_login = mysqli_num_rows($result_login);

        //SELECT `account` FROM `admin` WHERE `account` = '123' OR 1=1' -- AND `password` = '' 不可
        //SELECT `account` FROM `admin` WHERE `account` = '123' OR 1=1' -- AND `password` = ''
        //SELECT `account` FROM `admin` WHERE `account` = '123' OR 1=1 --' AND `password` = ''
        //SELECT `account` FROM `admin` WHERE `account` = '123' OR 1=1 -- AND `password` = ''  可
        echo $sql_login;

        if($row_login){
            $_SESSION['MM_USERNAME'] = $_POST['account'];
            header("Location:index.php");
        }else{
            header("Location:login.php");
        }
    }
    
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
        <label>帳號:<input type="text" name="account"></label>
        <label>密碼:<input type="password" name="password"></label>
        <input type="hidden" name="login_check" value="login_check">
        <input type="submit">
    </form>
</body>
</html>
1
Samと可樂快跑
iT邦研究生 1 級 ‧ 2019-11-28 10:45:05

防止sql injection最好的方法就是……
不.要.相.信.任.何.來.源.通.通.過.濾

也可以參考我2016年做的影片
PHP PDO 第二篇:如何防範SQL INJECTION

看更多先前的回應...收起先前的回應...

他...好像想問怎的打...

因為他說想多了解Sql Injection

fillano iT邦超人 1 級 ‧ 2019-11-28 11:42:44 檢舉

https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

如果要自己打,也是有免錢工具,上面規則比較多

ckp6250 iT邦新手 3 級 ‧ 2019-11-28 21:13:41 檢舉

  沒想到 cola 大仔的聲音還挺溫和地,和凶神惡煞的形象,落差很大,「如聞其聲,如見其容」在此似乎不成立。

  課上完了,一聽就懂,還有沒有別的課程啊?

我為什麼變成兇神惡煞了?

他的一套我都放集了
在這裏

https://tech.ihstar.com/threads/pdo%E5%BD%B1%E7%89%87%E6%95%99%E5%AD%B8%EF%BC%8C%E5%85%B14%E9%9B%86.32/

不過說真的,沒完全。
因為他後期很懶的再做影片下去了
喂喂,可樂快補續集啦!!

浩瀚星空
後來就工作忙碌啊!你又不是不知道我整個人跳進iOS陣營。
然後又不是不知道我一直都沒有參加鐵人賽。
因為弄那些教學都要花時間。

淺水員 iT邦新手 2 級 ‧ 2019-11-29 18:51:30 檢舉

不知道基礎教學中是不是應該稍微補充一下一些安全上的細節。下面這篇是我前幾個月才看到的,之前都不知道...
Are PDO prepared statements sufficient to prevent SQL injection?

0
純真的人
iT邦高手 1 級 ‧ 2019-11-28 11:00:58
SELECT account FROM admin WHERE account = '123' OR 1=1 --' AND password = ''

那大概是因為帳號沒有123.../images/emoticon/emoticon01.gif

0
浩瀚星空
iT邦大師 1 級 ‧ 2019-11-28 11:36:09

其實,答案是。
「--」並不是註解。

「-- 」才是。

選我正解。哈哈哈!!

看更多先前的回應...收起先前的回應...
豬豬人 iT邦新手 5 級 ‧ 2019-11-28 11:47:16 檢舉

後來試123' OR 1=1 --'就可以了

/images/emoticon/emoticon04.gif
這不是浩瀚星空大大!
這不是浩瀚星空大大!
這不是浩瀚星空大大!
選我正解
一看就是被海綿寶寶盜帳號的星空大

ps. 我印象中的星空大是跟我一樣上來交流切磋技術的/images/emoticon/emoticon10.gif

懷疑什麼?
這就是星空大。
只是要看是被小魚帶壞……
還是被我帶壞……

有需要這樣驚訝嘛!!!
我也想要搞怪一下沒!

哈哈!那一定是被小魚大帶壞的!可樂大的精髓是「不管我回答什麼,都不要給我最佳解答!」/images/emoticon/emoticon32.gif

Darwin Watterson
我說的可是真心話。
很多時候我覺得大家的回答都很棒。
卻硬要人家非得選出一個「正確答案」或是「最佳解」是很奇怪的一件事。
像藍色小舖,起碼還可以採取配分制度給每個回答者點數。

1
japhenchen
iT邦新手 1 級 ‧ 2019-11-28 12:22:09

不要使用form input及querystring到的變數來動態產生SQL查詢句,就算是非用不可,也要把單引號給逸脫代換掉,不然代誌潦潦

0
wilson1966
iT邦研究生 5 級 ‧ 2019-11-29 08:09:29

在SQL 裡判斷是否有 OR 關鍵字是否可防止 sql injection 攻擊?

沒必要。
過濾資料來源才是最正確的做法。

0
player
iT邦大師 1 級 ‧ 2019-11-30 18:55:07

防止SQL資料隱碼, 你需要的是
參數化查詢
https://zh.wikipedia.org/wiki/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2

我要發表回答

立即登入回答