LFD (Local File Disclosure) from SQL Injection

ဒီ Lab ေလးကိုေတာ့ Twitter ကေနေတြ႕လာတာပါ။ သာမာန္ ျမင္ေနၾကပံုစံမ်ိဳးမဟုတ္တာေၾကာင့္ က်ေနာ္ ေျဖၾကည့္ရင္းနဲ႕ ျပန္ေရးလိုက္တာပါ။ SQL Injection Vulnerability ကေနတစ္ဆင့္ Local File Disclosure အျဖစ္ကိုေျပာင္းသြားတဲ့ပံုစံေလးျဖစ္ပါတယ္။ သူ႕ရဲ႕ Lab မွာလဲ PDF အေနနဲ႕ walkthrough ပါပါတယ္။ က်ေနာ္ေရးတာနားမလည္ရင္ အဲဒါကိုၾကည့္လို႕လဲရတယ္။

Download Lab here 

https://github.com/incredibleindishell/Local-file-disclosure-SQL-Injection-Lab

Setup လုပ္တာေတာ့မေျပာေတာ့ဘူးေနာ္။ စလိုက္ၾကရေအာင္

ပထမဆံုး SQL Injection လို႕ဆိုတာေၾကာင့္ က်ေနာ္တို႕ SQL Injection ေပါက္တဲ့ေနရာကိုသိဖို႕လိုပါတယ္။ ဒီေတာ့ Database ကို ခ်ိတ္ဆက္ထားတဲ့ user input တစ္ခုလိုမွာေပါ့။ ဒါကိုအရင္ဆံုးလိုက္ရွာလိုက္မယ္။

User Input

Lab မွာ Download ဆြဲတဲ႕ေနရာေလးပါပါတယ္။ အဲဒီေနရာမွာ Post request ကိုသံုးျပီး database ထဲကေန image location ကို ဆြဲထုတ္ျပီး download ဆြဲခိုင္းတဲ့ process ေလးတစ္ခုရွိပါတယ္။

ဒီလုိဆို Post Parameter 2 ခုကို user input အေနနဲ႕ေတြ႕ရမွာျဖစ္ပါတယ္။

Source Code Review

$news="select * from download where id=".$_POST['image'];

ဒီ query ကေတာ့ SQL Injection ေပါက္ေစတယ္ဆိုတာ သိျပီးသားျဖစ္မွာပါ။ ဒါဆို image=1′ လို႕        ထည့္ၾကည့္လိုက္မယ္။

Yes ေသခ်ာသြားျပီ။ ဒါဆို Column ေလးစစ္ၾကည့္လိုက္မယ္။

order by 1-- // no error 
order by 2-- // no error
order by 3-- // no error
order by 4-- // error

Ok column 3 ခုရွိတယ္။ ဟုတ္ရဲ႕လား

ဟုတ္ပါတယ္ဗ်။ ဒါဆိုရင္ေတာ့ ဘယ္ဟာက file download လုပ္ထားလဲဆိုတာ စဥ္းစားၾကည့္မယ္ဗ်ာ။ တကယ္ေတာ့ ဒီ Database ကိုမျမင္ရပါဘူး။ ခုကေတာ့ ကိုယ္တိုင္စမ္းတာမလို႕ျမင္ရတာပါ။ မျမင္ရတဲ့အခါက်ေတာ့ Column 1,2,3 တစ္ခုခုက file download ခ်တဲ့ဟာဘယ္ဟာလဲဆိုတာသိေအာင္ က်ေနာ္တို႕ တစ္ခုခ်င္းစီမွာလိုက္ထည့္ၾကည့္မွရမွာျဖစ္ပါတယ္။ အခုကေတာ့ file path ကို column 3 မွာဆိုတာ သိထားေတာ့ column 3 မွာသာ သူ႕နဂိုလ္ရွိရင္းဆြဲ file path ကိုမေခၚပဲ ကိုယ္လိုခ်င္တဲ့ file path ကိုဆုိရင္ေရာ လို႕ေတြးရမွာျဖစ္ပါတယ္။

Fuzzing without knowing what column

union select <here>,2,3-- // not work
union select 1,<here>,3-- //not work
union select 1,2,<here>-- //work

ဒါကေတာ့ မသိပဲနဲ႕ဆို တစ္ခုခ်င္းစီကို စမ္းၾကည့္ရမယ့္ပံုစံ ျဖစ္ပါတယ္။

ခုကေတာ့သိျပီ column 3 က file path ကိုယူျပီး download ခ်တယ္ဆိုတာကို။ ဒါဆိုရင္ ဘယ္လိုလုပ္မွာလဲ။ သူ႕နဂိုပံုကိုၾကည့္ၾကည့္ပါ။

images/marine.jpg

ဒီ value ကို database ထဲကဆြဲထုတ္ထားပါတယ္။ ဒီေတာ့ က်ေနာ္တို႕ တျခား file တစ္ခုခုကိုထုတ္ၾကည့္မယ္။ က်ေနာ္ကေတာ့ Linux သံုးေနတာမဟုတ္ေတာ့ /etc/passwd ကိုထုတ္ျပလို႕အဆင္မေျပပါဘူး။ Linux နဲ႕စမ္းတဲ့သူေတြကေတာ့ /etc/passwd ကိုထုတ္ၾကည့္လို႕ရပါတယ္။ က်ေနာ္႕ကေတာ့ /Windows/system.ini ေလးပဲထုတ္ၾကည့္လိုက္တယ္။ Windows ကိုးဗ် ဟိဟိ ။

image=0 union select 1,2,'/Windows/system.ini'--&image_download=Download

POC

ဒီေနရာမွာ config file တို႕ လို အေရးၾကီးတဲ့ file ေတြကို Data Exfiltration ဆက္လုပ္ႏိုင္ပါတယ္။ file path ကိုဆြဲထုတ္တဲ့ ေနရာမွာ string ကို single quote ေတြခြင့္မျပဳဘူးဆိုရင္ေတာ့ 0x<hex_value_of_filepath> ပံုစံနဲ႕ ထုတ္ေပးလို႕ရပါတယ္။

Example with /etc/passwd

0x2f6574632f706173737764

စမ္းၾကည့္လိုက္ပါဦး စိတ္၀င္စားတယ္ဆိုရင္ေပါ့ 😀

Thanks for reading xD