본문 바로가기
WEB_Security(실습)/LOS

SQL Injection 실습3 ( Lord of SQLInjection )

by Jnamelight 2017. 6. 13.

Dark_Knight




다크나이트 문제를 분석해보자 일단 풀기 위해서는 pw 가 필요하다 그것도 admin의 것으로

즉 블라인드 인젝션 문제인것을 금방 알수있다.


하지만 여기서 계속 써왔던 substr,ascii 함수를 막아 놓았다...


두 함수의 우회법을 알아야 한다...!


1. substr 함수 -> mid, right(left) , substring 함수 등으로 우회 가능하다.

가장 쉬운 방법은 mid 함수이다. 똑같은 방식으로 작동하기 때문.


2. ascii -> ord, hex 등으로 우회 가능

ord는 ascii 와 같이 아스키 코드로 반환해준다. ( 확장된 아스키코드 8바이트씩 읽음 )

hex 는 16진수로 변환해준다.


이두함수를 적절하게 이용하면..




이런식으로 풀수 있다.



Bugbear



버그베어 문제는 다크 나이트에서 or, and ,공백 , like, = 까지 막아버렸다..

즉 위의 방법의 우회법을 알아야 풀 수 있다는 소리


or,and 는 저번에 말했듯이 ||,&& 로 사용하면 되고


공백 -> /**/ 주석을 사이에 넣는 방식, %0a, %0b, %0c 등 많은 방법이 있다.

like,= -> 비교하는 문장은 in 을 이용해서 우회하면된다.



버그베어에서 주의할점은 ord 는 사용을 못한다 이유는 or 을 막고 있기때문에 아에 먹히질 않음

그래서 hex 를 이용해서 우회 후 풀었다.



Giant



소스를 분석하는 순간 공백 우회 문제 라는것을 알아냈다..


하지만 처음에 공백 우회를 해보면서 공백우회를 다 막아 놓은 줄알았지만...



%0c 는 막지 않았다... 그래서 풀었다.. 약간 허망 ( 시간 많이 걸림...ㅠㅠ )




Assassin




많이 당황했던 문제이다.. 

처음에는 블라인드 인젝션 문제인줄 알고 여러가지 시도를 해보았다.

하지만 소스를 보면 알겠지만 단지 id 에 admin 의 값만 들어가면 된다....


그래서 like 의 사용법을 찾아보다가 like 의 순기능인... 검색 기능을 이용


pw like 1% --> 1이 맨앞에 있는 결과값 다보여줌


이런식으로 숫자 하나하나 대입해가면서 찾아낸 결과.


admin 은 없었다... 0~9 까지


여기서 추측해본 결과 admin과 guest 의 pw 의 값이 어느정도 일치 하는구나..!!


라고 생각하고 검색을 계속해나갔다.



그러자 답이 나옴!!! 


항상 비밀번호가 겹칠수 있다는 것을 인지하자!




Zombie_Assassin



좀비 어쎄신.. 처음에는 정말 간단한 문제인줄 알았다.

뭐그냥 id=admin/* pw=*/ 넣어서 중간을 주석처리 하고  admin을 불러오면 되는구나!

하지만 검색 결과에 /**/ 주석이 들어가면 조건을 처리 못한다..


한참 고민하던중 왜 하필 ereg 를 썻지? 라는 의문으로 ereg의 특징을 알아보니...

ereg 는 null을 만나게되면 함수가 종료되는 특징이있다..( 정말 취약한 함수...)

즉 null값을 넣고 하고싶은대로 하면된다!!!



널은 %00 임으로 %00 대입후 위와같이 아무조건을 줘서 클리어! (1=1 넣어도 될듯 id 에 조건이 없음으로 )



Succubus




좀비 어쎄신과 비슷한 문제 다른 유형 이라고 보면된다.

이번엔 ereg 가 아닌 preg_match 함수로 막아 놓았다...

하지만 좀비 어쎄신을 풀면서 생각해 놓은 중간을 주석 처리해버리기!! 라는 생각

이용해서 싱글쿼터(') 하나를 스트링으로 만들어버리면 중간의 쿼리는 값으로 처리 

한다 라는 아이이디어로 문제를 해결했다!



이런식으로 센스가 돋보이는 문제를 좋아한다.. 재밌게 풀었다 



Nightmare



이문제 역시.. 많이 해맸다.. 이문제를 풀기 위해서는 한가지 mysql 의 특징을 알아야한다.


mysql 에서는 조건절에서 

id =('')=0  이런식의 조건을 참으로 받아들이는 특징이있다. 

이조건을 안다면 쉽게 풀지만 모른다면.... 엄청 해맨다..



또한 여기서 한가지더 우회해야 하는 것이 있다.


주석의 우회

주석은 --,/**/,# 말고도 ;NULL  역시 주석으로 처리된다.



이두가지를 가지고 위와같이 조건을 주고 주석처리를 한다면... 클리어!

정말 어려운 문제였다..ㅠㅠ




Xavis




정말 ㅋㅋㅋ 웃음이 나오는 문제였다.


막힌것도 별로 없고 그냥 블라인드 인젝션이네~ 라고 생각했다면...


이상하게도 ascii 함수로는 절대로 값을 비교 할수 없다.

hex 역시 불가능 , 오직 ord 함수만으로 풀어야한다.



위에 설명했듯이 ord 함수는 ascii 함수보다 많은 값을 읽어 들이기 때문이다.

즉 블라인드 인젝션을 해보면 ord 를 사용해야하는 이유가 나온다.




풀어본 결과 답이 정말.... 확장된 ascii 코드 값이 답이다..

설마설마 하면서 풀었던 문제.. 의심하는 순간 시간이 배로 걸린다...




댓글