이 단계에서 라업을 쓸거라고는 별로 생각을 못했는데... 좀 많이 막힌 문제여서 라업작성을 한다. 사실 이런류의 취약점을 처음풀어본다. 그리고 점수에 안맞게 매우매우 어려웠다. 그리고 평소에 라업을 너무 대강쓰는 것 같아서 앞으로 쓰는 틀을 좀 정형화 시켜보려고 노력중이다. 보호기법은 위와 같다. got overwrite이 가능하다! 바이너리를 살펴보자면 크게 add, delete, cart, checkout 으로 나눌 수 있다. Add unsigned int add() { char **cart; // [esp+1Ch] [ebp-2Ch] char nptr; // [esp+26h] [ebp-22h] unsigned int v3; // [esp+3Ch] [ebp-Ch] v3 = __readgsdword(0x..
예기치 못한 종료로 파티션이 손상된 경우가 있는데 , 이경우 이렇게 되는 것 같다. BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash) Enter 'help' for a list of built-in commands. (initramfs)이렇게 되는데 fsck /dev/sda1 를 입력해주고 y를 계속 눌러준후 reboot을 몇번 해주면 고쳐진다. 또는 fsck /dev/sda1 -y 를 해주면 y를 눌려줄 필요가 없어진다
이 문제는 stdin과 stdout의 flag가 로컬과 다르기 때문에 이를 미리 세팅해놓고 푸는게 좋다. 서버의 환경은 stdin 0xfb2887 stdout 0xfbad208b 이다. largin bin attack을 이용해서 풀었다. 취약점은 다들 쉽게 찾을 수 있다. house of orange로 많이들 푸는듯.
우로보로스이다. 그 뱀이 꼬리 물고있는 그거 맞다. pw를 알아맞추는 문제라는 것을 알 수 있다. 별다른 조건이 없어서 1=1을 줘봤는데... 아무런 값이 안나온다. DB안에 아무런 값이 없는 것 일수도 있다. 검증차 union select 로 값을 줘봤다. 따라서 칼럼은 pw하나밖에 없다는 것을 알 수 있다. 그리고 테이블은 텅 비어있다는 것 또한 알 수 있다. 이러면 $result['pw']와 #_GET['pw']를 일치시켜 주는 것이 중요하다! 그리고 ===도 보이는데, 이건 엄격한 비교로 형식까지 비교를 한다. 예를 들어 지금 result[pw]=1 이고 , get[pw]=' union select 1 #이다. 그래서 생각을 좀 해보다가 이렇게 검색했다. 콰인이라는 것이 나와서 이걸로 검색해보기로..
컬럼은 no, ip, email로 3개이다. $_SERVER[REMOTE_ADDR]이 뭔지 찾아봤더니 이름 대로 ip를 반환하는 것이였다. 먼저 첫번째 쿼리에서는 joinmail의 값이 있으면 사용자의 정보를 table에 집어넣는다. 여기서 별다른 검사가 없어서 취약점이 존재한다. 그 다음 쿼리는 no=1 이거나 접속자의 ip와 동일한 아이템을 가지고 온다. 이렇게 말이다. 사용자의 정보는 no=0으로 들어간다. 마지막은 관리자의 email을 알아 맞추라는 내용이다. 삽질 많이했는데 sleep 함수같은 것도 안먹히는 것 같아서 좀 생각해보았다. 정답은 서브쿼리를 주는데 mysql에서는 자신 테이블에서 참조가 안되는데 테이블에 별칭을 주면 된다. 별칭은 as를 통해 줄 수 있다. (select email ..
일단 union 필터링, 괄호 필터링인 것 같다. 그리고 pw를 알아내야 한다. error based sql injection으로 풀 수 있는 문제이다. 그런데 괄호가 다 필터링 되어있어서 함수를 사용하는게 힘들 것 같다. 일단 괄호가 필요없는 like와 case when then을 사용해주기로 했다. 그리고 비밀번호의 길이를 구할 수 있는 방법이 딱히 없는 것 같아서 생각 안하기로 했다. 이건 그냥 모든 ascii 검사했는데 안나오면 그 때 멈추면 되기 때문에.. 그런데 error을 어떻게 유발할까 많이 생각을 해보았고 함수는 안되서 큰수를 곱해주는 것을 생각했다. 0으로 나누는 것은 error가 뜨지 않고 warning 이 나온다. 이 방법을 사용해서 like 함수로 비밀번호를 구하는 자동화를 만들겠..
'와 \를 검사해준다. 그리고 이번에는 패스워드까지 알아맞춰야 하는 brute force문제인 듯 하다. 그런데 일단 쿼리가 한번 실행 되고 나서 \,'검사를 한다. 일단 time baesd로 어느정도 해결이 가능할 듯하다. 지금까지 배운것들이 모두 가능하다는 전제하에 문제를 풀어야 될 것 같다. 일단은 비밀번호의 길이 먼저 구해보겠다. 일단 비밀번호의 길이는 8자인 것을 알아냈다. 이러면 상당히 쉬워진다. 동일한 방법으로 비밀번호 8자만 구하면 된다. d948b8a0이 나왔다. #!/usr/bin/python #-*-coding:utf-8 -*- import urllib,urllib2,requests import time header={"Cookie":"PHPSESSID=5b4vff***tab335qk..
조건은 id의 길이가 7까지 밖에 되지 않는다는 것. 그리고 no변수가 숫자인지 체크 한다는 것이다. 저 7바이트 가지고는 아무것도 못할 것 같아서 is_numeric함수에 대해 찾아보았다. php 공식 매뉴얼이다. '42' is numeric 1337 is numeric 1337 is numeric 1337 is numeric 1337 is numeric 1337.0 is numeric '0x539' is NOT numeric '02471' is numeric '0b10100111001' is NOT numeric '1337e0' is numeric 'not numeric' is NOT numeric array ( ) is NOT numeric 9.1 is numeric NULL is NOT numer..