[L2H] – The Art of Matching – Regular Expression in Python

Regular Expression ဆိုတာဘာလဲ?

Meaning

a sequence of symbols and characters expressing a string or pattern to be searched for 
within a longer piece of text.

အရမ္းမ်ားတဲ့ String ေတြမွာ ကိုယ္လိုခ်င္တဲ့ဟာကို symbols ေတြ characters ေတြသံုးျပီးေတာ့ စြဲထုတ္တဲ့ ဟာတစ္ခုျဖစ္တယ္။ ဒီေတာ့ အဲဒါေလးကို အျပင္ဥပမာတစ္ခုနဲ႕ တြဲျမင္ၾကည့္မယ္။ လူေတြအမ်ားၾကီးရွိတဲ့ စာသင္ခန္းထဲမွာ က်ေနာ္မျမင္ဘူးတဲ့ လူတစ္ေယာက္ကို သြားေတြ႕ခ်င္တယ္ဆိုပါေတာ့။ နာမည္ေလးသိလာရတယ္ဆိုရင္ အဲဒါဟာ Regular Expression မွာေတာ့ Pattern ပဲ ၊ ဒီေတာ့ နာမည္ကိုေခၚလိုက္ရင္ လူ ၁၀၀ ဆိုပါေတာ့ ၊ အမ်ားဆံုးတူဦး ၊ ၅ ေယာက္ေပါ့ ။ ဒီထဲကမွ ကိုယ္ေတြ႕ခ်င္တာဘယ္သူလဲဆိုတာကို ဆံုးျဖတ္ရတာ အရင္ထက္စာရင္လြယ္သြားျပီ။

Official Python 3 Module for Regular Expression

https://docs.python.org/3/howto/regex.html

Searching Strings

Before RE

find() ဆိုတဲ့ဟာရွိပါတယ္။ Regular Expression ေတာ့မဟုတ္ဘူး။ အလြယ္သံုးမယ္ဆိုရင္ေတာ့ဒါေလးကလြယ္တာေပါ့။

Example

string="ABCDEFGHIJK"
found=string.find("B")
print(found)

Result

ျမင္တဲ့အတိုင္းပဲေတြ႕တယ္ ၊ မေတြ႕ဘူးဆိုတဲ့ေနရာေတာ့ သံုးရင္အဆင္ေျပတာေပါ့။

ကဲ RE ကို စမ္းမယ္။

result = re.search(pattern, input_str, flags=0)

Syntax ကလဲ အရမ္းရိုးရွင္းပါတယ္။ input_str မွာ pattern နဲ႕ရွာမယ္ ၊ ရလာတဲ့ String ကုိ Result ဆိုတဲ့ Object ထဲကိုထည့္မယ္

စစခ်င္းကိုလြယ္ေအာင္လို႕ character နဲ႕စမး္မယ္။

"abc"

ဘာ data types နဲ႕ျပန္ရမွာလဲ

import re

regex="abc"
string="abcdefghijklmnopqrstuvwxyz"

result=re.search(regex,string)
print(result)

 

Object အေနနဲ႕ျပန္ရတယ္။ ဒီေတာ့ method ေတြရွိဦးမယ္။

Method / Attribute

group()
start()
end()
span()

Return type ေတြကဘာေတြျဖစ္မလဲ မဟုတ္ရင္ output ထုတ္တဲ့အခါက် format string ေပးတာမွားေနမယ္

import re

regex="abc"
string="abcdefghijklmnopqrstuvwxyz"

result=re.search(regex,string)
print("Using group() :\t"+repr(result.group()))
print("Using start() :\t"+repr(result.start()))
print("Using end()   :"+repr(result.end()))
print("Using span()  :"+repr(result.span()))

Module ကိုသံုးတာကေတာ့သိသြားျပီ ။ အဓိကသိရမွာက Regular Expression ကိုသိရမွာ

Delimiters and Flags

Delimiter ကေတာ့ re က programming ကိုစပါလာတည္းက string literal အေနနဲ႕ပါလာတာျဖစ္ပါတယ္။ delimiter ေတြကို r”pattern” အျဖစ္နဲ႕ျပသလို /pattern/ အျဖစ္နဲ႕ျပၾကတယ္။ ( for more )

Flag ကေတာ့ options လို႕ေျပာရမွာေပ့ါ။ pattern ကိုမွ Case sensitive ျဖစ္တာကို ignore လုပ္တာမ်ိဳး global လိုမ်ိဳး ဘယ္ကပဲျဖစ္ျဖစ္ယူမယ္ဆိုတာမ်ိဳး option ေလးေတြထပ္ထည့္တာျဖစ္တယ္။

Between Pattern

"Start-End"

Example

import re

regex=r"([a-z]+)"
string="abcdefghijklMNOpqrstuvwxyz"

result=re.search(regex,string)
print("Using group() :"+repr(result.group()))
print("Using start() :"+repr(result.start()))
print("Using end()   :"+repr(result.end()))
print("Using span()  :"+repr(result.span()))

a to z ဆိုအကုန္ထြက္လာရမယ္ MNO ေတာ့မပါဘူး

result

MNO မပါတာမဟုတ္ဘူး ဆက္ကိုမသြားတာ ဒါေၾကာင့္ flag ေတြလိုလာတာ

Case Sensitive ျဖစ္တာကို ignore လုပ္လိုက္မယ္ဆိုရင္ေရာ

import re

regex=r"([a-z]+)"
string="abcdefghijklMNOpqrstuvwxyz"

result=re.search(regex,string,flags=re.IGNORECASE)
print("Using group() :"+repr(result.group()))
print("Using start() :"+repr(result.start()))
print("Using end()   :"+repr(result.end()))
print("Using span()  :"+repr(result.span()))

ဒီေတာ့ reference ဒါမွမဟုတ္ cheatsheet ေလးေတြရွိထားမယ္ဆိုရင္ အဆင္ေျပျပီ

http://www.rexegg.com/regex-quickstart.html

ေနာက္ျပီး Online Regex စမ္းလို႕ရတာေလးေတြလဲရွိေသးတယ္။

https://regex101.com/
https://regexr.com

ဒီေတာ့ Hacking ရဲ႕ဘယ္လိုေနရာေတြမွာအေရးပါတာလဲ?

Examples

Source and Sinks

Source code review မွာေတာ့ အဓိကအေရးပါတာက Source and Sink ပဲ။

ဥပမာ Command Injection ဆိုပါေတာ့ ။

$_GET['input'] -> Source
system() -> Sink

ဒီေတာ့ ေနာက္ထပ္လိုက္တာက Source ေတြဘယ္ေလာက္ရွိလဲ ၊ Sink ေတြဘယ္ေလာက္ရွိလဲ ၊ ျပီးရင္အဲဒါေတြကို Source code ထဲမွာ Regular Expression နဲ႕ရွာလိုက္ရင္ စဥ္းစားလို႕ရျပီ။

(Document Object Model) DOM Based XSS

DOM XSS wiki

https://code.google.com/archive/p/domxsswiki/wikis/FindingDOMXSS.wiki

JavaScript ဆိုေတာ့ Client Side ျဖစ္ေတာ့ Source Code ကပါလာေတာ့ Source Sink ေတြရွာလို႕ရတာေပါ့။

Dominator Tool for DOM XSS

http://blog.mindedsecurity.com/2011/05/dominator-project.html

Matching in Bruteforce Attack

Bruteforce တိုက္တဲ့အခါ negative machine ေတြဘာေတြမွာလဲ Regular Expression ကိုသံုးလို႕ရတယ္။ဥပမာ Login Bruteforce တိုက္တယ္ဆိုပါေတာ့။ က်ေနာ္တို႕က Password မသိဘူး ၊ အဲ့ေတာ့ ရလာတဲ့ Result က “Password Incorrect ” တို႕ “Invalid Login” တုိ႕လို String မ်ိဳးက Response မွာပါလာတယ္။ အဲ့ေတာ့ username ေတြ password ေတြ ထည့္ျပီး Wordlist နဲ႕တိုက္တယ္ဆိုရင္ Invalid Login Response မွာ မပါလာခဲ့ရင္ဆိုတဲ့ Flow Control ကိုသံုးရတယ္။ ဒါမွ အဲဒါနဲ႕မတူေတာ့ဘူးဆိုရင္ အိုေကသြားတယ္ဆိုတာကိုသိမယ္။ ဒါကိုေတာ့ Negative Matching လို႕ေခၚတယ္။

Grep Match in Burp Suite Intruder Options

https://portswigger.net/burp/help/intruder_options

အျခား subdomain bruteforce တို႕ dirbuster တို႕လို Recon Tools ေတြလိုမ်ဳိးလဲသံုးလို႕ရတယ္။

Status Code က 404 မဟုတ္ရင္ ရွိတယ္ေပါ့။ Nagative Matching မဟုတ္ပဲ 200 ျဖစ္တာပဲလာျပဆိုတာမ်ိဳးကဒီေနရာမွာပိုေကာင္းလိမ့္မယ္။ 404 မဟုတ္ေပမဲ့ 302 တို႕လို status code တို႕ကိုပါမလိုခ်င္ဘူးဆုိရင္ေပါ့။

Sublist3r – Subdomain Domain Enumeration Tool

https://github.com/aboul3la/Sublist3r/blob/master/sublist3r.py

Filters in Intrusion Detection System

Intrusion Detection System ေတြမွာလဲ Regular Expression ကို Malicious Input ကို Detect သိဖို႕သံုးၾကတယ္။ ေအာက္ကပံုမွာ XSS နဲ႕ CSRF အတြက္ <> ေတြပါလား white space ေတြပါလား ဆိုတာကိုၾကည့္တဲ့ပံုစံေလးျမင္ရမွာျဖစ္ပါတယ္။

Expose – Intrusion Detection System for PHP

https://github.com/enygma/expose

Thanks