mysql 들어가지 않고 명령어실행하기
mysql DB명 -e "sql문"
ex) mysql mywebsite -e "update member set userpass=password('111111') where userid='admin'"
쉘스크립트shell 만들기
자신의 home 디렉토리에 bin 폴더를 만든다
argc=$# #### if문 사용 if [ $argc -eq 0 ]; then echo "Usage: $0 number" echo "number " echo " . 1: 비밀번호 출력" echo " . 2: 비밀번호 변경" echo " . 3: 비밀번호 확인" fi #### case 문 사용 case $1 in 1) mysql mywebsite -e "SELECT userid, userpass FROM member WHERE userid='admin'" ;; 2) mysql mywebsite -e "UPDATE member SET userpass=password('111111') WHERE userid='admin'" mysql mywebsite -e "SELECT userid, userpass FROM member WHERE userid='admin'";; 3) mysql mywebsite -e "SELECT password('111111'), password('222222')";; esac |
환경변수에 자신의 home 디렉토리를 넣어두면 어디서든 실행가능
chmod 766 change_dbpassword.sh
실행권한 변경해주고
change_dbpassword.sh 변수가 없이 실행하면 echo의 안내문을 출력하고
change_dbpassword.sh 2 이렇게 변수를 넣으면 sql 문을 실행한다
이런식으로 사용
* csrf 토큰을 정상적인 경로로 받되, 파라미터를 조작하여 다른 사용자의 정보를 수정하는 취약점을 방지하기
문제점 : 토큰과 별개로 no값을 조작하여
1. 세션정보에 토큰과 같이 no값을 같이 저장한다 ( 예시 : 토큰값+no값 )
2.
업로드 취약점
+ C99Shell 웹쉘
PHP로 작성된 웹 셸. 웹 어플리케이션에 업로드하여 서버를 원격 제어할 수 있는 도구
서버 제어, 명령 실행, 데이터베이스 접근 등
실제 모의해킹시에는 웹쉘이 아니라 간단한 php 실행코드를 올린다
아파치 웹서버 로그 디렉터리
/var/log/httpd/
+ access_log : 모든 접속 기록
+ error_log : 에러 로그
cmd로 /etc/passwd 노출 취약점
파일 업로드 대응 방안
1) eregi 함수
(정규식 활용) .php 또는 .html 등의 문자열을 찾아 필터링한다. 대소문자구분x
그런데 PHP 5.3.0 부터는 사용권장x 7.0.0 부터는 완전히 제거된 함수.
이후부터는 preg_match 함수를 사용하면 된다
if(eregi(".html|.php", $upfile)) {
echo "<script>alert('업로드 불가능한 확장자 파일입니다'); history.back();</script>";
exit;
}
vi /etc/httpd/conf/httpd.conf
<Directory />
AllowOverride none
Require all denied
</Directory>
AllowOverride none를 All로 고치고
.htaccess 파일을 업로드한다
내용 : Addtype application/x-httpd-php .txt
(type을 추가하여 .txt를 php로 인식하는것)
이 때 분산설정 때문에 .txt를 php코드로 인식할 수 있다
.txt 파일인데도, cmd를 통해 pwd경로가 나타난다
설정변경시 반드시
# systemctl restart httpd.service
서버재시작해야 적용됨
2) 게시판에 업로드 되는 디렉터리에 php 코드가 실행되지 못하게 금지시키기
장점 : 업로드 디렉터리 제어 가능
단점 : 업로드 디렉터리가 변경되면 아파치 웹서버의 설정이 무용지물이 된다
개발부서와 인프라팀의 운영부서가 다를경우 반드시 커뮤니케이션 필요
파일 업로드 구현시 주의점
1. 파일 업로드 디렉터리에 php 코드 금지 (권장)
2. 업로드 디렉터리에 허용하는 확장자를 지정한다
3. 분산설정파일 금지 (권장)
4. .htaccess 파일을 필터링하고 주기적으로 검사한다 (단, 자료 용량이 300G 이상일 경우 현실적으로 불가능)
5. 업로드 디렉터리 위치를 랜덤문자열을 활용하여 저장한다 ex) /data/랜덤문자열/업로드파일명
파일 업로드 취약점을 이용한 리버스 커넥션
은 다음시간에.
파일 다운로드 취약점
파일경로에서 filename 파라미터의 값을 원래 파일명에서 ../../../../../../../../../../../etc/passwd 으로 변경하면 중요파일에 접근하는 등 취약점이 있다
필터링
$contents = str_replace("<script>", "", $row['contents']);
$contents = str_replace("<", "<", $row['contents']);
SQL 인젝션
- 중요 데이터 유출, 데이터베이스 손상, 권한상승(관리자 권한 탈취), 백도어 설치가능성 등.
- Non Blind SQL(Error, Query Result), Blind SQL(Boolean, Time based)
안전한 쿼리 사용
PreparedStatement 쿼리를 사용
vi /etc/my.cnf
general_log = 1
general_log_file=/var/lib/mysqld/webhacking.log
설정파일 수정 후, systemctl restart mariadb 재시작
=> tail -f /var/lib/mysqld/webhacking.log 로 실시간 로그 탐지 가능