OWASP Juice Shop Walkthrough

Juice Shop Walkthrough ေလး ေလ့လာျပီး ျမန္မာလိုျပန္ေရးေပးထားပါတယ္။ ဒီ Lab ကေတာ့ DVWA တို႕နဲ႕မတူတဲ့အခ်က္က Vulnerable Application က Node JS နဲ႕ေရးထားတာျဖစ္ပါတယ္။ Node JS ကလဲ ခုေနာက္ပိုင္းအရမ္း ေခတ္စားလာတဲ့ Server Side JavaScript တစ္ခုျဖစ္ပါတယ္။ ဒါေၾကာင့္ က်ေနာ္တို႕အေနနဲ႕ ေလ့လာသင့္တဲ့ Lab တစ္ခုလဲျဖစ္တာေပါ့။ Lab ရဲ႕ပံုစံကေတာ့ CTF ပံုစံေလးျဖစ္ပါတယ္။ ဒါေပမဲ့ Lab ကို လုပ္မယ့္သူအေနနဲ႕ကေတာ့ Node JS ရဲ႕ အေျခခံကိုသိထားဖို႕လိုပါမယ္။ Node JS က ဘယ္လိုအလုပ္လုပ္တယ္ ဘယ္လိုေတြ structure ရွိတယ္ စသည္ျဖင့္သိထားမွသာ က်ေနာ္တို႕ Security Flaws ေတြကိုေလ့လာတဲ့အခါမွာ အမွန္တကယ္နားလည္မွာျဖစ္ပါတယ္။ Node JS ရဲ႕ Basic Structure ကိုေတာ့ မၾကာခင္ အၾကမ္းဖ်င္းေလာက္ေရးေပးဖို႕ စဥ္းစားထားပါတယ္။

OWASP Juice Shop Project

Finding the scoreboard

ဒါကေတာ့ အရမ္းလြယ္ပါတယ္။ Source Code ထဲမွာ score board က JavaScript Comments အေနနဲ႕ရွိေနတာကိုေတြ႕ရမွာျဖစ္ပါတယ္။

<li class="dropdown">
                <a href="#/score-board">Score Board</a>
</li>

Error Handling 

Error Handling ဆိုတဲ့ေနရာမွာ က်ေနာ္တို႕ error တက္ေအာင္လုပ္ရပါမယ္။ Error တက္တယ္ဆိုတဲ့ေနရမွာ Web app က သူ႕ဟာသူအားလံုးအဆင္ေျပေအာင္ေရးထားျပီးသားမုိ႕ ပံုမွန္တိုင္းဆို ဘာ error မွာတက္စရာအေၾကာင္းကမရွိပါဘူး။ ဒီေတာ့ က်ေနာ္တို႕ က error တက္ေအာင္လုပ္ရမယ္ဆိုေတာ့ အေရးၾကီးတာက Input လိုပါတယ္။ ဒါေၾကာင့္ search box or login form ေတြမွာ input ကေတာ့ ရွိတယ္မဟုတ္လား ။ ဒါေၾကာင့္ အဲဒီေနရာေတြမွာထည့္ၾကည့္မယ္။

Search box

http://localhost:3000/#/search?q=';

Database ကို SELECT လုပ္တဲ့အခ်ိန္မွာ အရင္သိထားတဲ့ SQL Injection လိုပဲ String Error တက္မွာျဖစ္ပါတယ္။ ဒါေပမဲ့ PHP error လိုမ်ိဳး Web Page မွာဘာမွလာမေပၚတဲ့အတြက္ေၾကာင့္ က်ေနာ္တို႕ input ဟာ Database နဲ႕ခ်ိတ္ထားသလိုဆိုတာေတာင္မသိႏိုင္ပါဘူး။

JSON data အေနနဲ႕ error ကိုျပတာျဖစ္တဲ့အတြက္ Browser ရဲ႕ Developer Tool နဲ႕ Network ထဲကေန က်ေနာ္တို႕ request ရဲ႕ response data ကိုၾကည့္ရင္ သိႏိုင္ပါတယ္။ ဒါမွာမဟုတ္တျခား Headers ကိုၾကည့္ႏိုင္တဲ့ tool တစ္ခုခုနဲ႕ၾကည့္လဲရပါတယ္။

Database က SQLite သံုးထားတယ္ဆိုတာကိုပါ Error အရအခုက်ေနာ္တို႕သိထားျပီ။

Login Page မွာဆိုရင္ေရာ ? query error တက္သြားေအာင္ ထံုးစံအတိုင္း single quote ေလးထည့္ၾကည့္လိုက္မယ္။

{"error":{"message":"SQLITE_ERROR: unrecognized token: \"3590cb8af0bbb9e78c343b52b93773c9\"","stack":"Error: SQLITE_ERROR: unrecognized token: \"3590cb8af0bbb9e78c343b52b93773c9\"\n at Error (native)","errno":1,"code":"SQLITE_ERROR","sql":"SELECT * FROM Users WHERE email = ''' AND password = '3590cb8af0bbb9e78c343b52b93773c9'"}}

email=’ ‘  ‘ ျဖစ္သြားတာေၾကာင့္ string မွန္းမသိဘာမွန္းမသိျဖစ္ကုန္တာေၾကာင့္ SQL query က error တက္တာကိုေတြ႕ရမွာျဖစ္ပါတယ္။

XSS Tier 1 

ပံုမွန္ Reflected XSS ကေတာ့ လြယ္ပါတယ္ Input လိုမယ္။ Ouptput လိုမယ္။ Ouput မွာ validated မလုပ္ဘူးဆိုရင္ေတာ့ HTML or JS ေတြက browser ေရာက္ရင္ အလုပ္လုပ္ကိုလုပ္မွာပဲ။ Search Box မွာထည့္ၾကည့္လိုက္မယ္။

http://localhost:3000/#/search?q=%3Cscript%3Ealert(%22XSS1%22)%3C%2Fscript%3E

Five-Star Feedback

ဒါကိုေျဖဖို႕က Administration Section ကိုရဖို႕လိုပါတယ္။ ဒါေၾကာင့္ Access Admin Section ဆိုတဲ့ဟာကို အရင္ေက်ာ္ေျဖလိုက္မယ္။

Dist Folder ထဲမွာ routing လုပ္ထားတာေတြကုိေတြ႕ရမွာျဖစ္ပါတယ္။

ဒါဆိုရင္ adminstration section ကိုရျပီ။ ဒါေၾကာင့္ five star feedback ဆိုတဲ့ဟာကိုျပန္ေျဖမယ္။ ဒီခါက်ေတာ့ administration section ကုိရေနျပီျဖစ္တာေၾကာင့္ feedback ေတြကိုဖ်က္ပစ္ဖို႕က delete ဆိုတဲ့ icon ေလးေတြကို ႏွိပ္လိုက္ယံုပဲရွိပါေတာ့တယ္။

Confidential Document

ဒါလဲခုနလို dist folder ထဲကေန directory ေတြကိုရွာလို႕ရပါတယ္။ ဒါမွမဟုတ္ရင္ေတာ့ About Us ထဲမွာ Link ေလးတစ္ခုပါေနတာကိုေတြ႕ရမွာျဖစ္ပါတယ္။

http://localhost:3000/ftp/legal.md?md_debug=true

ဒီလိုဆို ftp ဆိုတဲ့ directory ရွိေသးတယ္ေပါ့။

http://localhost:3000/ftp

ဒီလိုဆို တျခား file ေတြကို access ရေနျပီေပါ့။

Zero Stars

ဒီတစ္ခါကေတာ့ contact မွာၾကယ္ေပးတဲ့ဟာေလးကို bypass လုပ္ရမွာျဖစ္ပါတယ္။ သူ validate လုပ္ထားတာက star တစ္ခုမွမေပးပဲနဲ႕ user က comment ေပးလို႕မရဘူး ဆိုတာမ်ိဳးျဖစ္ပါတယ္။ ဒီေနရာမွာ က်ေနာ္တို႕က ဘာမွ မေပးခ်င္ဘူးဗ်ာ။ star မေပးဘူးဆိုရင္လဲ submit ကႏွိပ္လုိ႕မရဘူး။ ဒီေတာ့ star တစ္ခုေလာက္ေပးလိုက္မယ္။ submit ေပၚလာတယ္ အဲ့ေတာ့မွ star ကိုျပန္ျဖဳတ္လိုက္မယ္။

ဒီနားမွာက်ေနာ္တစ္ခ်က္စဥ္းစားတာက post parameter value ကိုျပင္လို႕မရဘူးလားလို႕ေတြးမိတယ္။ မရဘူးဗ်။ value ထဲမွာဘာမွမပါဘူး။ parameter name မွာတည္းက rating နဲ႕ comment က ပါျပီးသြားျပီ။

Login Admin

ဒီတစ္ခါေတာ့ admin အေနနဲ႕ login ၀င္ရမွာျဖစ္ပါတယ္။ ဒါကေတာ့ သိပ္အခ်က္ၾကီးမဟုတ္ပါဘူး။ အစပိုင္းတုန္းက error handling မွာတည္းက SQLi ေပါက္ႏိုင္တယ္ဆိုတာသိျပီးေနျပီပဲဟာ။

SQL error

SELECT * FROM Users WHERE email = ' \ ' AND password = '3590cb8af0bbb9e78c343b52b93773c9'

\ ေၾကာင့္ အေနာက္က ‘ single quote က escape ျဖစ္သြားတယ္ဆုိေတာ့ ေသခ်ာတယ္။ SQL Injection ေပါက္ေနတယ္ဆိုတာ ဒီေတာ့ Bypass လုပ္ၾကမယ္။

email=' our input' 

password=' idk '

email မွာ တည္းက ပံုမွန္ SQLi အတိုင္း statement ကို မွန္ေအာင္လုပ္ႏိုင္ရင္ ေနာက္က password အတြက္စိတ္ပူစရာမလိုေတာ့ဘူး။ admin email ကိုလဲ ခုန /administration area ကေန က်ေနာ္တို႕သိျပီးသားျဖစ္ပါတယ္။ admin@juice-sh.op ျဖစ္ပါတယ္ ဒါေၾကာင့္

admin@juice-sh.op' or '1'='1

Password Strength

ဒီဟာမွာေတာ့ description ေလးဖတ္ၾကည့္ရေအာင္ဗ်ာ

Log in with the administrator's user credentials without previously changing them or applying SQL Injection.

admin အေနနဲ႕ login ၀င္ရမွာပဲျဖစ္ပါတယ္။ ဒါေပမဲ့ SQL Injection ကိုမသံုးပဲနဲ႕ လုပ္ရမယ္လို႕ဆိုပါတယ္။ ဒီေတာ့ ေခါင္းစဥ္ကလဲ password strength လဲျဖစ္တယ္ ဒါေၾကာင့္ ျဖစ္ႏိုင္တာကေတာ့ Weak password တစ္ခုခုျဖစ္လိမ့္မယ္။ ဒါေပမဲ့ ဒီတိုင္းလိုက္ျပီး guessing လုပ္ေနမယ္ဆိုရင္ေတာ့ သိပ္မဟုတ္ေသးဘူး ဒီေတာ့ bruteforce တိုက္လိုက္တာေကာင္းပါတယ္။ admin email ကေတာ့သိျပီးသားျဖစ္တဲ့အတြက္ password ကိုပဲတိုက္စရာလိုပါမယ္။ bruteforce တုိက္တာကေတာ့ သိျပီးသားျဖစ္မွာပါ။ burp suite or hydra စတဲ့ tool ေတြကိုသံုးျပီး စမ္းလို႕ရပါတယ္။

password = admin123

Access Someone else’s basket

ဒီတစ္ခါလုပ္ရမွာကေတာ့ တျခားတစ္ေယာက္ေယာက္ရဲ႕ basket ကို access ရရမယ္လို႕ဆိုပါတယ္။ ဒါက parameter manipulation နဲ႕ဆင္ပါတယ္။ ကြဲျပားတာကေတာ့ ဒီမွာ parameter ေတြရွိေနတဲ့ေနရာေတြကအစ ကြဲျပားေနတာပဲျဖစ္ပါတယ္။ JS script ကိုအေျခခံျပီးေရးထားတဲ့အျပင္ ဒီ Application က HTML 5 ကိုလဲသံုးထားတာျဖစ္တဲ့အတြက္ က်ေနာ္တို႕မွာ Local Storage နဲ႕ Session Storage စတာေတြပါပါလာတယ္ဆိုတာကို HTML5 ကိုသိတယ္ဆို သိျပီးသားျဖစ္မွာပါ။ ဒီေတာ့ က်ေနာ္တို႕ရဲ႕ basket အတြက္ session ကို Session Storage ထဲမွာသြားသိမ္းထားတယ္ဆိုတာကိုေတြ႕ရမွာျဖစ္ပါတယ္။

ဒါဆိုရင္ parameter manipulation လိုပဲ session value ေတြကို change ၾကည့္မယ္ဆိုရင္ေရာ ?

bid=2

Forgotten Sales Backup

Backup file ေတြက်န္ေနခဲ့တယ္လို႕ဆိုပါတယ္။ ဒါေၾကာင့္ က်ေနာ္တို႕ အေပၚမွာတုန္းကေျဖထားဘူးတဲ့ေနရာမွာ တျခား file ေတြကို /ftp ဆိုတဲ့ directory ထဲမွာ ေတြ႕ခဲ့တယ္မဟုတ္လား။

coupons_2013.md.bak ဆိုတဲ့ backup file ေလးတစ္ခုေတာ့ေတြ႕တယ္။ ဖြင့္ၾကည့္လိုက္မယ္။

.md & .pdf ဆိုတဲ့ file ၂ ခုကိုပဲ ၾကည့္လို႕ရတယ္လို႕ေျပာပါတယ္။ ဒါေပမဲ့ ဒါက LFI bypass ဘာညာရရင္ မခက္ေတာ့ပါဘူး။ .md လဲျဖစ္မယ္ ဒါေပမဲ့ .md ကလဲအလုပ္လုပ္ေစခ်င္ဘူးဆိုရင္ေတာ့ Null Byte Injection သံုးေပးရမွာေပါ့။

http://localhost:3000/ftp/package.json.bak%00.md

%00 ကို URL မွာထည့္တဲ့အခါ မရရင္ URL Encode လုပ္ေပးဖို႕မေမ့ပါနဲ႕။

http://localhost:3000/ftp/package.json.bak%2500.md

Login with Bender’s User Account

ဒီတစ္ခါလုပ္ရမွာကေတာ့ Bender ဆိုတဲ့ user အေနနဲ႕ က်ေနာ္တို႕ Login ၀င္ရမွာျဖစ္ပါတယ္။ ဒီေနရာမွာ Login ၀င္မယ္ဆိုေတာ့ က်ေနာ္တို႕ Bender ရဲ႕ password ေတြဘာေတြလဲ မသိပါဘူး။ email ကေတာ့ သိပါတယ္ administration တုန္းက ျမင္ခဲ့ဖူးတာပဲဟာ။ bender@juice-sh.op ျဖစ္ပါတယ္။

SQL Injection သံုးျပီး ၀င္မယ္ဆိုရင္ေတာ့ အေပၚမွာတုန္းကလိုမ်ိဳးပဲ admin email ေနရာမွာ Bender ရဲ႕ email ကို ထည့္ျပီး ၀င္ရင္ရပါတယ္။ ဒါေပမဲ့ ေနာက္တစ္မ်ိဳး ရွိေသးတာက မွားယြင္းတဲ့ configuration ေတြရွိေနတတ္ေသးတယ္ဆိုတာကို သိေစခ်င္တဲ့သေဘာပါ။ က်ေနာ္တို႕ သူမ်ား Application ကိုရွာတာပဲျဖစ္ျဖစ္ ကိုယ္တိုင္ေရးတဲ့အခါမွာပဲ ျဖစ္ျဖစ္ သတိမထားမိတတ္တာေလးေတြရွိႏိုင္ပါတယ္။ ဒါေတြကို Lab ေတြမွာ သင္ယူရတာေပါ့။ အခုလုပ္ရမွာေတာ့ က်ေနာ္တို႕ ပံုမွန္ အတိုင္း Login ၀င္လိုက္မယ္။ က်ေနာ္တို႕ user acc ကိုေပ့ါ။ Login ၀င္ျပီးျပီဆိုတာနဲ႕ Change Password ဆိုတာေလးကိုေတြ႕မွာျဖစ္ပါတယ္။ ဒီေနရာမွာ က်ေနာ္တို႕ရဲ႕ password ကို change လို႕ရတယ္။

http://localhost:3000/#/change-password

အစမ္းသေဘာမ်ိဳးနဲ႕ က်ေနာ္တို႕ change ၾကည့္လိုက္မယ္။

ဒီ Request ကို ေသခ်ာၾကည့္ရေအာင္

http://localhost:3000/rest/user/change-password?current=safe123&new=lolsec&repeat=lolsec

ဒီ Request ကို သက္သက္ျပန္ေခၚၾကည့္လိုက္မယ္။

{"id":7,"email":"thinbashane@gmail.com","password":"e960e21fbe2a6295fd2b1318f5511e83","createdAt":"2017-04-13T17:58:42.000Z","updatedAt":"2017-04-13T18:14:14.000Z"}

ဒါကေတာ့ အလုပ္လုပ္တယ္ဆိုတဲ့သေဘာေပါ့ Json data ေတြ response ျပန္လာတယ္။ ဟုတ္ျပီ။ တကယ္လို႕ current password ကိုမထည့္ဘူးဆိုရင္ေရာ?

http://localhost:3000/rest/user/change-password?new=lolsec&repeat=lolsec

အလုပ္လုပ္ေနတုန္းပဲဆိုတာ ေတြ႕ရပါလိမ့္မယ္။

{"id":7,"email":"thinbashane@gmail.com","password":"e960e21fbe2a6295fd2b1318f5511e83","createdAt":"2017-04-13T17:58:42.000Z","updatedAt":"2017-04-13T18:17:56.000Z"}

ဒီလိုဆိုရင္ေတာ့ က်ေနာ္တို႕ current password မသိပဲနဲ႕ password change လို႕ရသြားျပီ။ ဒါဆိုရင္ Bender ဆိုတဲ့ user ရဲ႕ password ကို ကိုယ္လိုခ်င္တဲ့ဟာ ေျပာင္းလို႕မရဘူးလား? ရပါတယ္။ SQL Injection ေၾကာင့္ က်ေနာ္တို႕ Bender အေနနဲ႕ Login ၀င္လို႕ရတာပဲ။ ဒီအခ်ိန္မွာ ေျပာင္းလိုက္လို႕ရပါတယ္။

Christmas Special

ဒါကေတာ့ Christmas Special product ေတြကို order လုပ္ေပးရပါမယ္။ ဒီေနရာမွာ Web Page ေပၚမွာ မျပေတာ့တဲ့ Christmas Products ကို order လုပ္ခိုင္းတာဆိုေတာ့ database ထဲမွာ ရွိတယ္ဆိုတာကို သိရမွျဖစ္မွာေပါ့။ ဒါကပံုမွန္ဆို သိေနစရာမရွိေပးမယ့္ SQL Injection ကေပါက္ေနေတာ့ က်ေနာ္တို႕ SQL Statements ကိုမွန္ေအာင္ ထည့္ႏိုင္ရင္ အကုန္လံုးထြက္က်လာတယ္ဆိုတာ သိျပီးသားျဖစ္ေနပါျပီ။ Search Box မွာ ‘; ထည့္တုန္းက SQL error တက္တာ အေပၚမွာျပန္ၾကည့္ပါ။

SQL Error

SELECT * FROM Products WHERE ((name LIKE '%';%' OR description LIKE '%';%') AND deletedAt IS NULL) ORDER BY name"

ဒီ statement ကို မွန္ေအာင္သာ Inject လုပ္ႏိုင္ရင္ က်ေနာ္တို႕ အကုန္လံုးကို ၾကည့္လုိ႕ရျပီ။ သူက * ဆိုေတာ့ အကုန္လံုး select လုပ္ထားတာကိုး။

((name LIKE '%ဒီေနရာ%' OR description LIKE '%ဒီေနရာ%')

SQL Comment ရွိတဲ့ အတြက္ ေနာက္ကဟာေတြကို terminate လုပ္လို႕ရတာျဖစ္တဲ့အတြက္ ဟုိေနာက္က AND ေနာက္က Query ေတြကို ေမ့ထားလိုက္လို႕ရပါတယ္။ အဓိက Input ၀င္သြားတဲ့ေနရာပဲ အေရးၾကီးတာဆိုေတာ့။

((name LIKE '%'))--         %' OR description LIKE '%';%')

ကဲခုဆိုရင္ ေနာက္ကဟာေတြ အားလံုးကို Comment အျဖစ္နဲ႕ အလုပ္မလုပ္ခိုင္းေတာ့ဘူး။ ဒါဆိုရင္

SELECT * FROM Products WHERE ((name LIKE '%'))--

XSS Tier 2

အေပၚက XSS နဲ႕မတူေတာ့ပါဘူး။ Level ျမင့္လာတဲ့အတြက္ပိုခက္လာမွာေတာ့ ေသခ်ာပါတယ္။ ဒီေတာ့ လြယ္လြယ္ကူကူ search box လိုေနရာမ်ိဳးေတြမွာ မေပါက္ေတာ့ဘူးေပါ့။ ဒါေၾကာင့္ က်ေနာ္တို႕ သူေျပာထားတာေလးတစ္ခ်က္ျပန္ၾကည့္ရေအာင္

Perform a persisted XSS attack with <script>alert("XSS2")</script> bypassing a client-side security mechanism.

Persisted XSS လို႕ဆိုပါတယ္။ ဒါဆိုရင္ေတာ့ နည္းနည္း စဥ္းစားရတာက်ဥ္းသြားျပီ။ persisted XSS or Stored XSS ဆိုတာက database ထဲမွာ သိမ္းထားတဲ့ process ေတြမွာ ေပါက္တတ္တယ္ဆိုတာ XSS ရတဲ့သူတိုင္းသိပါတယ္။ ဒါေၾကာင့္ database ထဲကိုသိမ္းတာဘာေတြရွိမလဲ ?

User Registeration လုပ္လို႕ရတယ္ဆိုတာေတာ့ အားလံုးလဲသိျပီးသားပါ။ ဒီေတာ့ ဒီေနရာမွာ email နဲ႕ password က input ျဖစ္မယ္။ user register လုပ္တာျဖစ္တဲ့အတြက္ database ထဲလည္း သြားသိမ္းထားမွာပဲ။ ဒီေတာ့ ဒီေနရာမွာ Stored XSS ေပါက္ႏိုင္တယ္ဆိုတာ ေတြးလို႕ရမယ္။ ဟုတ္ျပီ ဒီေတာ့ တစ္ခ်က္ၾကည့္လိုက္မယ္။

http://localhost:3000/api/Users/ ဆိုတဲ့ URL ကို request တစ္ေဆာင္ပို႕လိုက္တာ ေတြ႕ရပါမယ္။ ခုကအဆင္ေျပေနေတာ့ response မွာ success လို႕ေပၚေနတာကိုအေပၚက ပံုမွာေတြ႕ရလိမ့္မယ္။ ဒီေနရာမွာ က်ေနာ္တို႕က XSS Payload ကိုထည့္ခ်င္တာပါ။ ဒါေပမဲ့ တစ္ခုေျပာခ်င္တာက email ကို validate လုပ္ထားပါတယ္။ lol@gmail.com ဆိုတဲ့ေနရာမွာ payload ကိုဒီတိုင္းထည့္တဲ့အခါမွာ email format မဟုတ္တဲ့အတြက္ invalid email လို႕ျပေနပါတယ္။ ဒါဟာ JavaScript နဲ႕ စစ္ထားတာဆိုရင္ေတာ့ browser နဲ႕ Server ရဲ႕ ၾကားက proxy ဆိုတဲ့ေနရာမွာ ျပင္မယ္ဆိုရင္ေရာလို႕ေတြးစရာေလးရွိေနပါတယ္။ ဒါေၾကာင့္ နဂို register ေနရာကေနမလုပ္ေတာ့ပဲနဲ႕ http://localhost:3000/api/Users/ ကုိတန္းျပီး က်ေနာ္တို႕ modify လုပ္ထားတဲ့ request တစ္ခုပို႕မယ္။ ဒီေတာ့ သူ႕ original header ေလးကိုၾကည့္ရေအာင္

General

Request URL:http://localhost:3000/api/Users/
Request Method:POST
Status Code:200 OK
Remote Address:[::1]:3000
Referrer Policy:no-referrer-when-downgrade

Request Header

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:69
Content-Type:application/json;charset=UTF-8
Cookie:_ga=GA1.1.1574913714.1489596361; continueCode=wjKRWbLRo7kYz8mjyQ3p9aJEDngB0NV05ev1WwPNxZq64KV2OrMXblog1LEQ; io=785IWtfSfrEGxArzAAAB
Host:localhost:3000
Origin:http://localhost:3000
Referer:http://localhost:3000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36

Request Payload

{email: "lol@gmail.com", password: "abcde", passwordRepeat: "abcde"}

Header ကိုၾကည့္လိုက္လ်င္ေတာ့ရွင္းပါျပီ။ Post method ကိုသံုးထားတယ္။ ဒီေတာ့ Request Payload ဆိုတဲ့ ေနရာမွာ email ရဲ႕ value ျဖစ္တဲ့ lol@gmail.com ဆိုတဲ့ေနရာမွာ XSS Payload ကိုထည့္ၾကည့္မယ္။ Chrome မွာ POST request တစ္ခုစမ္းဖို႕ POST Man ဆိုတဲ့ chrome app တစ္ခုကိုသံုးထားပါတယ္။

Post Data

{"email": "<script>alert(\"XSS2\")</script>", "password": "xss"}

Send Request with POST Man

Success ေတာ့ျဖစ္သြားျပီ။ ဒီေနရာမွာ နည္းနည္းေလးေျပာခ်င္တာေလးရွိတယ္။ ဒါက Stored XSS လဲျဖစ္သလို ေနာက္တစ္ခုက Blind XSS ရဲ႕ပံုစံေလးကိုလဲျပထားပါတယ္။ ဘာေၾကာင့္လဲဆိုရင္ အဲဒီ user email ေတြကို administration မွာပဲ output ျပတယ္ဆိုတာ အေပၚမွာေတြတည္းက က်ေနာ္တို႕သိျပီးသြားျပီ။ ဟုတ္ပါတယ္။ အဲဒါကို blind လို႕ေခၚပါတယ္။ ကိုယ္ထည့္လိုက္တဲ့ input က ကိုယ္ access ရတဲ့ဆီမွာ ouptput မရွိဘူး။ admin panel or authorized user ေတြသာ ၀င္လို႕ရတဲ့ေနရာမ်ိဳးမွာ output ျပေနခဲ့ျပီဆိုရင္ေတာ့ အဲဒါကို Blind XSS လို႕ေခၚပါတယ္။ သာမာန္အားျဖင့္ေတာ့ ရွာရခက္ပါတယ္။ Source Code ေပးထားလို႕ source code analysis လုပ္တာတို႕ Security Audits လုပ္တာ စတဲ့ အခ်ိန္ေတြမွာသာ ေတြ႕ႏိုင္ေခ်မ်ားတဲ့ တစ္ခုေပါ့။ ဒီအေၾကာင္းေလးလဲ ေျပာျပခ်င္ေနတာၾကာပါျပီ။ ခုေတာ့ ဒီမွာလာပါေနေတာ့ ျပီးေရာေပါ့။

XSS output in Administration

User Credentials

လုပ္ေဆာင္ရမွာကေတာ့ user credentials ေတြကို SQL Injection ကေနတစ္ဆင့္ ရယူေပးရမွာျဖစ္ပါတယ္။ SQL Injection  ဘယ္မွာေပါက္ေနတယ္ဆိုတာေတာ့ သိျပီးသားလဲျဖစ္တယ္။ ဟုတ္ျပီ SQL ရဲ႕ True Statement ေျပာင္းလိုက္ယံုနဲ႕ Xmas product ကို ၀ယ္ရတုန္းက မွတ္မိမယ္ထင္ပါတယ္။ အခုကေတာ့ product ဆိုတဲ့ table ကိုလိုခ်င္တာမဟုတ္ေတာ့ဘူး။ user credentials ေတြသိမ္းထားတဲ့ အျခား table တစ္ခုမွာရွာမွျဖစ္ေတာ့မယ္။

http://localhost:3000/#/search?q='))--

ဒီဟာက product ထဲကဟာေတြပဲျပတာ ဟုတ္ျပီ အဲဒီ product ဆိုတဲ့ table ထဲမွာ column ဘယ္နခုေလာက္မ်ားရွိမလဲဗ်ာ။

')) order by 1--    // No error
')) order by 100--    // Error

Column 8 ခုရွိတာကို ေတြ႕ရပါလိမ့္မယ္။ ဒီ ၈ ခုထဲမွာ ဘယ္ Column ေတြကို output ျပလဲဆိုတာကိုသိခ်င္ေတာ့ union select နဲ႕ ဆြဲထုတ္လိုက္မယ္။

')) union select 1,2,3,4,5,6,7,8--

ဒီမွာေျပာစရာနည္းနည္း႔ရွိပါတယ္။ SQL Database က MySQL မဟုတ္ဘူး SQLite ကိုသံုးထားတာျဖစ္တယ္လို႕ အေပၚမွာတုန္းကလဲ error handling တုန္းကေတြ႕လို႕သိရပါတယ္။ @@version တို႕ version() တုိ႕လည္းအလုပ္မလုပ္ဘူး။ ဒါေပမဲ့ ေစာေစာကေျပာသလို သိေအာင္လုပ္ရမွာျဖစ္ပါတယ္။ ေနာက္တစ္ခုက MySQL လို information_schema လဲမရွိေတာ့ အရင္လို အျခား tables ေတြဘာညာအကုန္လံုးကို ၾကည့္တာမ်ိဳးက မရေတာ့ျပန္ဘူး။ ဒါေပမဲ့ error handling တုန္းကပဲ ဘယ္ tables က ထုတ္တယ္ဆိုတာ login က error မွာ သိႏိုင္ပါတယ္။ Users ဆိုတဲ့ table ထဲက ထုတ္တယ္ဆိုတာသိရပါတယ္။ ဘာေတြလဲဆိုရင္ေတာ့ id, email, password စတာေတြပါ၀င္တာေပါ့။ ဒါေတြလဲ error ထဲမွာပါျပီးသားပါ။

')) UNION SELECT 1,id,email,password,5,6,7,8 from Users--

Post Some Feedback in another username

တျခား user အေနနဲ႕ feedback ေပးရမယ့္ task ျဖစ္ပါတယ္။ ဒါကေတာ့ တျခားမဟုတ္ဘူး။ ပံုမွန္အတိုင္းဆိုရင္ username က anonymous ျဖစ္ေနတာကိုေတြ႕ရမွာျဖစ္ပါတယ္။ ဒါကို မလိုခ်င္ပဲ က်ေနာ္တို႕က တျခားတစ္ခုခုအေနနဲ႕ ေျပာင္းလဲေပးရမွာျဖစ္ပါတယ္။

ဒီကေနျပီးေတာ့ submit လုပ္လိုက္တဲ့အခ်ိန္မွာ request တစ္ခုထြက္သြားတာကိုေတြ႕ရမွာျဖစ္ပါတယ္။ /api/Feedbacks ကိုပို႕တာျဖစ္ပါတယ္။

Request ေတြ response ေတြကိုတစ္ခ်က္ၾကည့္ရေအာင္။

{comment: "abcde", rating: 1}
comment
:
"abcde"
rating
:
1

request payload ထဲမွာ userID ပါမလာတာကိုေတြ႕ရမွာျဖစ္ပါတယ္။ ဘာေၾကာင့္လဲဆို က်ေနာ္တို႕က login မွ ၀င္မထားတာ။ ဒါေၾကာင့္ ၀င္ျပီး json ကိုသိေအာင္လုပ္မယ္။

JSON with userID

{UserId: 7, comment: "lol", rating: 2}
UserId
:
7
comment
:
"lol"
rating
:
2

ဒီေနရာမွာ တျခား userID ေျပာင္းျပီး request တစ္ခုပို႕ၾကည့္မယ္။ Post Man ကိုသံုးပါမယ္။

Success ျဖစ္သြားတာကိုေတြ႕ရမွာျဖစ္ပါတယ္။ userID ကို 1 နဲ႕ ေပးလိုက္တာျဖစ္ပါတယ္။

Feedbacks ေတြကို administration မွာ ျပန္စစ္ၾကည့္ရေအာင္

ပထမ anonymous အတြက္က ဘာမွ မပါဘူး ။ ျပီးေတာ့ registered လုပ္လိုက္တဲ့ user နဲ႕က 7 က်ေနာ္တို႕ change လိုက္တဲ့ 1 ေတြ အေနနဲ႕ ၀င္ေနတာကိုေတာ့ ေတြ႕ရမွာျဖစ္ပါတယ္။

XSS Tier 3

မၾကာမွီ လာမည္