정보보안 스터디 - 15주차 5일 - 주석을 사용한 SQLi
☞ SHA256 해시값 사전 대입 공격, 레인보우 테이블로 평문 알아내기
sha256 해시 값이 노출되어서 얻었다면 john을 통해서 사전 대입 공격이 가능합니다.
물론 솔트 값이 없거나 길지 않고, 예측가능한(길지않게 설정된) 비밀번호여야 찾을 수 있을 것입니다.
echo -n 'test' | sha256sum > password
john --wordlist=./word.txt --format=raw-sha256 hash.txt
-n 으로 줄바꿈을 해줘야 오류가 뜨지 않습니다.
다음과 같은 오류가 뜰 때는 기존 로그를 삭제해주거나, --show 로 결과를 확인합니다.
john --wordlist=./word.txt --format=raw-sha256 hash.txt --show
또는
rm -rf .john/john.pot
아무 파일도 적지 않을 시 기본은 password.lst 파일로 대조를 합니다.
자주사용하는 파일인 cat /usr/share/wordlists/john.lst 또는 rockyou.txt 를 사용해도 됩니다.
☞ 주석으로 띄어쓰기 우회
php에서 주석은 /**/를 애용합시다.
//이 가능한데
//는 그 부분부터 라인의 끝까지 모두 주석처리 되지만
/* */는 해당 부분만 선택적으로 주석처리가 가능합니다. css에서는 원래 알고있던 정보입니다.
MYsql에서도 마찬가지로 부분적으로 주석처리 하고싶다 한다면
select * from board where idx=1 or/*or*/ uid=admin 를 사용합니다. 하지만 이 때 띄어쓰기 처리는 안되기 때문에 공백 처리로의 우회가 어려워보입니다.
# 한 줄의 경우 |
-- 한 줄의 경우 |
/* 여러줄의 주석일 경우 */ |
☞ SQLi 예시
주소가 논현로12길 3 이라면 공백을 기준으로 $arr[0], $arr[1]로 나눠지면서 일반적으로는 여기에서 임의로 SQL문 삽입이 어려울 것입니다.
여기서 방법은 php부분에서 띄워쓰기를 우회하는 문자를 넣거나
mysql부분에서 띄어쓰기를 우회하는 문자를 넣는 방법이 있는데
php에서는 /**/를 포함한 전체가 문자로 나옵니다.
MYSQL 에서 /**/를 사용하면 띄어쓰기를 하지 않고도 명령이 가능합니다.
하지만 직접 mysql로 삽입은 여전히 가능했지만
phpmyadmin 을 통한 삽입은 될때도 있고 오류가 생겨 안될 때도 있는 것 같습니다.
확실한 이유를 알아봐야할 것 같지만 어쨋든 실제로는 /**/가 문제없이 작동되는게 맞기 때문에 사용하도록 합니다.
같은 SQL 구문을 실행한 모습.
그외로도 공백을 우회할 수 있는 방법입니다.
참고로
union select 1,2,3,4,5 like '%nono%'
>> 5에 nono가 안들어가면 0, 5에 nono가 들어가면 1을 출력합니다.
참고2
옵션 태그 <select ~ required> 꼭 입력하도록 제한을 줄 수는 있는데, 이것도 클라이언트 측 검증이라 디자인으로만 넣고 정확한 서버 검증이 필요합니다.