정보보안 스터디 - 28주차 3일 - bWAPP, PortSwigger lab
☞ bWAPP 기본 정리
sqli_10-1.php
ajax/json이면 XSS말고 SQL 노립니다.
구조 예상하고
select * from movies where title like '%as%' and 1=1# '
되는지부터 먼저 봅니다.
json은 db에서 가져오는 거 맞습니다.
url encoding 적용하니까 되는 경우도 있습니다.
as%25%27+and+1%3D1%23
+는 띄워쓰기 적용되는 거 맞고
오히려 GET as%' and 1=1# 그대로 치면 안됩니다.
xpath는
DB SQL 이 아니라 xml 로 DB이루어졌을 때이며 구조를 잘 생각합니다.
그러면 완전 xml 데이터베이스 구조로 가서 다른 유저 가져오거나
몇번째 노드에 무슨 데이터가 있는지 알 수 있고
자식 부모가 뭔지 알 수 있음.
실제 할 때도 막하는 게 아니라 단서 모은다는 느낌으로 퍼즐처럼 도식화 감 잡아가면서 해야합니다.
input
xpath("/heroes/hero[id='$login' and pwd='$password']") 로 됨
공격구문
select * from user where uid=' superhero' or '1'='1' or '1'='1 ' and pwd=''
uid='superhero' or 참 or 참 and 거짓
uid='superhero' or 참 or 거짓
uid='superhero' or 참
and가 먼저 처리 되므로 이런식으로 해줘야 참이 됩니다.
$result = $xml->xpath("/heros/hero[uid='$uid' and pwd='$pwd']") 라서
neo에 대한 xml 정보 다 가져오고 result[0]->uid, result[0]->secret 보여줍니다.
근데 XML형식은 ajax/json or xml 많이 사용할텐데 유저정보 DB로 xpath 사용하지는 않기 때문에 우선순위는 아닙니다. > 필요할 때 공부합시다.
xss_json.php
기능이 이렇게 되는 경우가 있으면
처음에 어떤 거 사용할까, 어떻게 작동할까 SQL을 넣을까(어떤 쿼리일까), XSS을 할까 생각해본다음에
burp > json,xml,그냥post/get 요청하는지, json, xml, 그냥으로 응답하는지 확인.
다시 XSS를 할까 SQL을할까 생각합니다.
reflected
iron man을 적었을 때 있다고 응답함.
iron을 적으면 reflected로 응답함. >SQL, XSS가능성.
바로 text/html 본문에 반응하는 거라면 iron<script>alert(1);</script> 넣으면 작동하겠지만
json으로 답하거나(자바스크립트 작동하지만 문법다르게) xml으로 답하면 자바스크립트 작동안합니다.
> 그냥 이건 자바스크립트 JSON.parse(JSONResponseString); 로 innerHTML = JSONRespoinse.movies[0]해서 값넣어주는 구조이므로 iron"}]}';alert(1);// json 빠져나와서 alert해주면됩니다.
xss_ajax_2-1.php
text/html으로 답오기 때문에
자바스크립트로 xmlHttp.open으로 -2.php에 document.getElementById("title").value 값 넘기고
200 반응오면 JSONResponse = eval("(" + xmlHttp.responseText + ")");
JSON InnerHTML 뿌려주는 구조입니다.
json안에서 한다음 innerHtml하는것이기 때문에 json안에서 스크립트 만들 수 밖에 없습니다.
xss_ajax_1-1.php
get요청 > text/xml (<?xml ?>)로 응답함. 그럼 <script> 바로 넣는것도 안되고
서버측에선 xml구조에서 뽑아오는 게 아닌
그냥 array() 중에서 GET으로 받아서 찾는거였습니다.
<![CDATA[<script>alert(1);</script>]]>
<![CDATA[<a href="javascript:alert(1);">hi</a>]]>
로 xml안에 html 또는 스크립트 넣는 방법이 있다고는 하는 데 안됩니다.
기본적으로 ajax는 둘다 xmlhttprequest로 움직인다고 생각하면 됩니다.
rlfi.php
1. 클릭했을 때 반응이 나머지 구성은 똑같고 그것만 달라질 때
2. 이건 전체 새로고침이 되면서 변경되는 겁니다.
3. 보통 당연히 rfi보다는 lfi가 대부분일거고 파라미터=.jsp 해서 풀네임으로 불러오면 가능한 부분입니다.
ajax랑 헷갈리긴 하는데 둘 다 목적은 억개의 페이지가 있을 때 수정할 때 모두 안하고 그 부분만 변경하기 위해서입니다.
xxe-1.php
xml 형식으로 요청보내고 html형식으로 받아옵니다.
xml형식으로 보내면 <!DOCTYPE XXE [<!ENTITY XXE "groot">]>해서 적용되는 지 일단 봐야됩니다.
된다면 <!DOCTYPE XXE [<!ENTITY XXE SYSTEM "file:///etc/passwd">]>
SYSTEM http:// php:// file:// 다 해봅니다.
아마 docker환경이라 안될 수도 있습니다.
☞ portswigger lab
SSRF
back-end REST APIs
보안이 없는 방식
?stockapi=http://stock.shop.net:8080/
post/get방식
>>>
http://localhost/admin
사용 가능한 이유는 만약의 재해를 위해 로그인하지 않고도 접속가능하도록 설정했습니다.
보통 80포트가 아니라 다른 포트8080 등 리슨중이라서 아마 안되고 다른포트 써야할겁니다.
웹서버뿐만아니라 다른 back-end host systems도 가능합니다.
방화벽으로 내부ip만 오게막기 때문에 내부는 보안이 약하긴합니다.
https://192.168.0.68/admin
ip를 ACL로 막는 게 아니라 이건 그냥 사설ip면 들어올 수 있도록한 웹서버입니다.
내부 시스템에서 stock 그냥받아오는 경우
?stockapi=http://192.168.0.1:8080/stock/
변수요소는 ip랑 port, url
블랙리스트 127.0.0.1 and localhost 하는 경우
2130706433, 017700000001, 127.1 , http: > https: 등의 우회방안을 사용합니다.
이 때는
주소먼저 127.0.0.1이 안된다면 127.1로 접속되는지 확인하고 /admin 이 안된다면 -> %61%64%6d%69%6e url 인코딩으로 우회 접속합니다.
화이트리스트 우회도 있지만 어렵습니다.
full url로 적어놓지 않습니다.
path=/product/
이 때는 풀도 가능한 경우도 있고 아니면 무조건 내부 경로만 include한 경우도 있고.(현재 사이트의 내부라서 서버측에서 http:// 를 붙여서 작동합니다.)
open redirect
redirect한다는건 그냥 내 브라우저로 직접 들어가는 겁니다.
서버가 들어가게 해야됩니다.
stockapi=는 내부만 되고 리다이렉트 직접 들어가서 하니까 내부 들어갈 수 있는걸로.
내부 파일 불러오는 / 것도 도움이 되니 찾고, path= 해서 직접 들어가는 것도 필요합니다.
왜 이기능을 사용해야될까. 꼭사용할 것같은 느낌. 찾습니다.
--
파일 업로드
파일 이름 제대로 검증안하면 overwrite로 삭제할 수 있습니다.
웹쉘처럼 파이썬파일도 실행가능합니다.
<?php echo file_get_contents('/path/to/target/file'); ?>
이걸 업로드해서 실행하면 파일 읽기 가능
☞ 실전이라면?? 어떤 부분을 봐야할까요?
보통 SSRF는 외부API까지는 아니고 내부API나 네트워크로의 전송을 위해 사용합니다.
재고를 확인하는 등 내부서버로 날리는 걸 찾아보면됩니다.
예를 들어 path=/stock/ 로 되어있을 때 확인해봤는데 직접적으로 접근했을 땐 ip차단 될 경우
또는 path=/ 되어있어도 - http:// 풀로 했을 때도 리다이렉트하는 지 확인
stockapi=/product/stock/check?pid=3 - 이건 그냥 이동하는 게 아니라 서버가 직접 post로 확인하는 겁니다. (LFI랑 비슷) http://~/product 이면 어떨까 생각. 이게 중요. 풀url로 반응하지 않기 때문에 일부러 짧게했구나 예상해볼 수 있습니다.
파일의 경로가 단순하게 1:1로 매칭되지 않도록 설정했을 거기 때문에 소스코드 확인까지 가능한 경우는 잘 없습니다.
page include 를 실행하는 파라미터들 (page=, file=, show=, help=)
백업파일 브루트 포스로 확인하는 경우 gobuster -x bak
git log+ git checkout로 지운파일 복구
>>
클라우드 호스팅이면 클라우드 메타데이터 접근 http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-default-ssm/ (AWS EC2 예시)