webhacking/sql, sql injection

webhacking.kr 27, 29

qkqhxla1 2015. 1. 15. 15:41

27.

sql 인젝션. no입력칸이 있고 소스보면

필터링문자는 #|union|from|challenge|select|\(|\t|/|limit|=|0x이고, 구문은

"select id from challenge27_table where id='guest' and no=($_GET[no])" 이다.

no=-1같이 화면에 출력안되는 값으로 입력하고, )로 닫아준 후에 우회해주면 된다.

-1) or no=2# 하면 되는데 =와 #이 필터링이다. 여는괄호도 필터링이므로 in()은 못쓰고 like로 우회해준다. 주석은 #대신 -- 을 쓴다. (-- 후에 한칸 띄워준다.)

-1) or no like 2-- 또는 url에 ?no=-1%29%20or%20no%20like%202%20--%20로 입력하면 된다.




29.

파일이름 인젝션 문제. 아무 파일이나 올려보면 내용이 뜬다.




time,ip,file이 들어가는 것 같다. 파일명이 들어가는 걸로 보아 sql의 insert문이 쓰일 것 같다.

예상 : insert into c29_tb(컬럼,컬럼,컬럼) values('','','');

파일명을 '등으로 입력해 보면 에러가 뜬다. ')#, ','')# 등으로 내가 인젝션할수 있는 위치가 어느 위치인지 찾아본다. ' , '''')# 처럼 입력시에 에러가 안 뜨는 걸로 보아 내가 입력할 부분은 values('요기','','); 이다. insert문 내부에 서브쿼리로 위의 힌트에 적혀있는 컬럼을 가져오면 된다. 쿼리문을 짤 시에 서브쿼리방식으로 안에 집어넣으면 된다.

예로 contacts테이블에 insert문 안에 서브쿼리문을 넣을시 같은 테이블의 열을 대상으로 하면 업데이트되고 있는 쿼리에서 또 찾아오려고 한다고 안된다고 에러 메시지가 뜬다. 업데이트나, 인서트같은 변화되고있는 테이블에서의 서브쿼리문은 다른 테이블을 대상으로 호출해야 제대로 된다...(직접 실험한 결과.)

‘,(select password from c29_tb),내 아이피 주소))#하면 되는데 .이필터링된다.

char함수로 우회하면.

',(select password from c29_tb),char(아이피 주소를 아스키로 변경한값))#

파일명을 위의 쿼리문으로 하고 업로드하면 성공