본문 바로가기

SISS/Webhacking.kr

(9)
old-03(350) 당황스러운 판이 나왔다. 열심히 문제를 풀어서 동물 발바닥 같은 모양이 나왔다. 그대로 solved 버튼을 클릭하니 이와 같은 페이지가 나왔다. 대충 na2na7을 입력하자 이러한 페이지가 나왔다. webhacking.kr/challenge/web-03/index.php?_1=1&_2=0&_3=1&_4=0&_5=1&_6=0&_7=0&_8=0&_9=0&_10=0&_11=0&_12=1&_13=1&_14=1&_15=0&_16=0&_17=1&_18=0&_19=1&_20=0&_21=1&_22=1&_23=1&_24=1&_25=1&_answer=1010100000011100101011111 URL을 복사해 보았다. 뒤에 answer라고 1과 0으로 이루어진 문자열이 있다. 1번 칸에서 25번 칸까지 까맣게 칠해졌으면..
old-08(350) getenv(): 환경변수를 가져오는 함수이다. 여기서는 "HTTP_USER_AGENT"라는 환경변수를 가져온다. $SERER['HTTP_USER_AGENT']는 접속자의 접속 브라우저를 의미한다. trim(): 문자열의 맨 앞과 맨 뒤의 여백을 제거한다. $_SERVER['REMOTE_ADDR']: 웹서버에 접촉한 접속자의 IP를 의미한다. 접속자의 IP를 $ip에 저장한다. $agent에 from이 들어가 있으면 Access Denied를 출력하고, $agent를 출력한다. count(): sql에서 테이블에 존재하는 데이터의 개수를 가져온다. 이때, NULL인 것은 제외한다. chall8이라는 table에서 id의 개수를 구해 $count_ck에 저장한다. 만약 그 개수가 70개 이상이면 chall..
old-53(350) SQLinjection인 것 같다. 코드를 보니, val에는 select나 by가 들어가면 안 된다. val의 값이 a의 값으로 설정된다. answer와 $hidden_table이 같은 경우에 문제가 풀리는 것으로 보아, 테이블 명($hidden_table)을 알아내야 한다. 쿼리를 날린 뒤, 그 결과의 첫번째를 출력하므로, val에 이것 저것 넣어본다. val에 값을 넣었더니 true, 1,2,3,4에서 a의 값이 나온 것을 알 수 있다. 어떻게 하면 테이블명을 알 수 있을까 검색하는 차에 procedure analyse()를 알게 되었다. procedure analyse()를 사용하여 쿼리를 명령하면 데이터베이스명.테이블명.컬럼명 형태의 정보를 획득할 수 있다. a에 포함되는 1을 이용하여 val=1..
old-49(300) SQL injection 문제이다. 소스코드를 살펴보면 select or and ( ) limit , / order cash (공백) (탭문자) ' " 를 필터링한다. 빈칸에 입력한 내용이 $_GET['lv']가 되는 모양이다. lv에 1부터 차례대로 값을 넣어보았으나 5부터는 해당되는 결과가 없었다. admin이 lv가 몇인지 알 수 없다. 따라서 id가 admin인 id를 고르라는 쿼리문이 되도록 해야 한다. 여기서 소괄호를 오른쪽, 왼쪽 모두를 쓸 수 없어 함수는 사용이 불가능하고, admin이라는 문자열 자체를 필터링하고 있어 바로 admin을 넣기는 어렵다. 따라서 admin을 아스키코드의 16진수 값으로 변환해야 한다. 쿼리문을 보낼 때 lv=을 무력화시켜야 하므로 아무런 결과가 나타나지 않는..
old-48(350) 들어가면 귀여운 이미지와 함께 시각과 id로 보이는 문자열, 누군가 써놓았던 것 같은 문자열이 있다. 시험삼아 imhungry를 입력했다. 입력한 시각과 함께 이미지, 아이디, 입력한 문자열, 그리고 맨 오른쪽에는 [Delete]가 있다. 눌러보면 쓴 글이 사라진다. 바로 위의 그림에 나타난 부분의 소스코드다. 입력할 수 있는 공간이 있길래 를 입력했다. 내가 쓴 문자열에서는 필터링하는 문자가 없는 것 같다. 아니면 아예 입력한 문자열을 일반 문자열로 만들었을지도 모른다. 혹시 파일을 업로드하거나 [upload file]을 누르면 다른 일이 생길까봐 xss를 목적으로 한 문자열을 저장한 파일을 올렸다. [upload file]을 눌러보니, 내가 썼던 문자열이 그대로 나와있다. 마찬가지로 필터링은 없는 것..
old-11(300) 들어가자마자 Wrong이라고 적혀있다. 코드를 살펴보자 $pat에 정규식을 저장하고 있다. 1~3 중의 숫자 하나와 a~f 중의 알파벳 5개와 현재 나의 서버 IP에 탭p탭a탭s탭s를 붙여야 한다. 여기서 GET으로 정보를 받고 있으므로 탭 문자를 url 코드로 인코딩한 결과인 %09로 바꿔줘야 한다. 1aaaaa_(나의 IP)%09p%09a%09s%09s 를 val에 넣어주면 되겠다. 나의 IP를 확인하기 위해 findip.kr 이라는 사이트로 들어가 봤다. 대문짝만하게 내 아이피 주소가 써져 있다. 여기서 알아낸 아이피 주소로 위의 (나의 IP)를 대체한 값을 val에 넣어준다.
old-07(300) 들어가면 화면이 위와 같이 나와 있다. 소스 코드를 살펴보면 $_GET['val']의 값을 $go에 저장해서 $go에 2 - \+ from _ = \\s \* \\ 가 들어가면 exit 함수가 작동한다. 그리고 랜덤으로 1에서 5까지의 수를 생성하여 $rand에 저장하고 $rand의 값에 따라 쿼리문에서 $go를 감싸는 소괄호의 개수가 달라진다. 이 쿼리를 날려서 얻은 결과를 배열로 만들었을 때, 이 배열의 0번 인덱스의 값이 없으면 "query error"를 출력하고, 1이라면 눌렀을 때 'Access_Denied!' 알림이 뜨는 버튼을 출력하고, 2라면 눌렀을 때 'Hello admin'이라는 알림이 뜨는 버튼을 출력한다. mysql select 쿼리 결과가 없을 때로 검색을 했더니 조회된 row가 ..
old-27(150) SQL Injection 문제다. no에 # select ( 공백 limit = 0x 를 필터링 하고 있다. 주석으로 admin의 no가 2라고 알려주고 있다. 우선 id가 'guest'로 고정되어 있는데, 이것을 무력화해야 한다. 그러기 위해서는 id='guest'와 and로 묶인 no값을 조정해야 한다. 1을 넣고 입력했더니 guest라고 나온다. 위에서 언급한 대로 2는 admin의 no인 모양인지 query error가 뜬다. 0을 넣었더니 아무런 결과가 나오지 않는다. select id from chall27 where id='guest' and no=(여기에 무언가를 넣어야 한다.) 결과의 id가 'guest'가 나오지 않도록 no에 0이나 2 등의 값을 넣고 그 뒤에 or을 사용한다. 공백을..