웹해킹 4주차 [ PHP 학습 & 워 게임~]
이전에 '지옥방 멘토링'에서 했던 PHP 학습
https://caputdraconis.tistory.com/10
지옥방 멘토링을 할때 미리 해놓은 덕분에 MAMP 가 노트북에 깔려있었기에 설치하기 강의는 건너뛸 수 있었다. 이런 소소한거에 행복을 느낀다,,ㅎㅎ
이 위치에 있어야 localhost에서 열 수 있어요오!!
위와 같이 작성된 php파일을 브라우저로 열면 어떻게 출력될까??
php 태그 안에 있지 않은 echo는 그냥 그대로 출력이 되고 php 태그 안에 있는 echo는 Hello World만 출력된걸 볼 수 있다.
이를 브라우저의 소스코드로 보면
<?php echo "Hello World" ?>는 Hello World로 바뀌어 들어간걸 볼 수 있따!! 개쩐다잉
var_dump(원하는 데이터형)은 입력한 수의 데이터형과 값을 아래처럼 보여준다.
위의 코드는 그냥 1234와 "1234"를 비교할 수 있다.
1234는 정수이고, "1234"는 string, 즉 문자열로 인식되는 것을 볼 수 있다.
문자열은 점 . 으로 이어진다. 위의 코드를 실행하면 helloworld가 출력이 된당.
변수
변수는 앞에 달러표시를 붙여 $a와 같이 사용한다. $a에 1과 2를 차례대로 대입시켰다. 그 변수는 숫자처럼 사용할 수 있다.(문자열도 가능)
echo와 print는 비슷한 기능을 한당.
상수 변하지 않는 값;
위의 코드를 실행하면 'Title'이라는 이름에 'PHP Tutorial'이라는 값이 상수로 저장된다. 이 상태에서 echo Title을 하면 PHP Tutorial이 실행되는걸 알 수 있다. 이후에 Title에 다른 값인 'CSS Tutorial'을 대입하려하자 Constant 뭐시기 하면서 오류가 뜨는걸 볼 수 있다.
$a에는 "subject"가 저장되어있다. 그 밑에서 $$a??????이게 무엇일까
$a 는 subject다. 그럼 $$a는 $subject가 아니겠는가!!?? 그렇당ㅎㅎ
$a에 들어오는 값으로 변수이름을 정해서 사용할 수 있단게 쪼끔 매력적이다.
비교
<?php
$a=1;
var_dump($a==1);// ==
echo "<br />";
var_dump($a!=1);// !=
echo "<br/>";
var_dump($a>20); // > < <= >=
echo "<br/>";
var_dump($a=="1"); //==과 ===의 차이
echo "<br/>";
var_dump($a==="1");
echo "<br/>";
?>
== 약한 동등..? 이건 1과 "1"을 같다고 판단해!!! 아주 아량이 넓은 친구지
!= 이건 동등의 반대야! 1!=2는 true를 반환해. 신기한 아이지?
> ,< ,>= , <= 이거 다 학교 다니면서 배웠지요옹~
=== 이건 진짜 처음 보는걸꺼야! 같다(=)가 3개나? 엄청나게 같다는거지. 이건 ==과 달리 1==="1"은 false를 반환한단다?
근데 왜 반말이지.
<입출력 & form태그>
URL로 전송된 데이터를 받을 수 있다. 위의 코드는 localhost/~~/num.php?id=caputdraconis&pwd=1234라는 주소로 접속했을시
Welcome caputdraconisYour PW is 1234라고 출력이 된당.
물음표?와 &로 구성되는 것을 기억하자!
form
위와 같은 코드를 적고 실행하면
이와 같은 형태의 form 형식이 생성된다. id 칸에 적은 값, password 칸에 적은 값은 submit 버튼을 눌렀을때 1.php가 실행되며 주소 뒤에 < id=id칸에 적은 값&pwd=password칸에 적은 값 >의 형태로 서버로 전송된당.
GET vs. POST
위의 코드를 보면 form 태그에 method 라는 속성의 값으로 get이 주어졌다.
GET 방식과 POST 방식의 차이는 submit 버튼이 눌렸을때 바뀌는 url에서 드러난다.
위와 같이 값을 적고 제출을 눌렀을때
<GET>
바뀌는 URL에 ? 뒤로 입력한 값들이 그대로 드러난다. 하지만 이렇게 되면 개인정보가 드러날 위험이 있다! 이를 막기 위해 사용하는 POST방식은 아래와 같은 URL로 변한다.
<POST>
아까와 같은 값으로 전달했지만 POST 방식을 사용할때는 URL에 입력한 데이터가 드러나지 않는다. 비밀이 많은 친구다.
조건문
많은 언어에서 배워왔던 것과 같은 형태와 기능을 하기에 간단하게 보고자 한다.
첫번째 if문이 true이기 때문에 'result : true'가 출력되고, 아무리 else if의 조건문이 참이라고 해도 이미 if가 실행된 이상 밑의 else if와 else는 출력되지 않는다.
간단하게 아이디, 비밀번호 입력창을 만들고 제출버튼을 누르면 login.php로 정보가 id와 pwd라는 이름으로 전해진다.
$_GET['id']와 $_GET['pwd'] 를 이용해 index.html 로부터 전달된 정보를 사용한다.
아이디와 비밀번호를 조건문 중첩을 통해 비교하고 상황에 맞는 문구를 출력한다.
<조건문>
조건문도 이미 다른 언어에서 다뤘던것과 기능이 같으니 간단하게..ㅎㅎ
AND 좌항과 우항이 모두 참(true)일때 참을 반환한다. &&도 가능
OR 좌항과 우항 중 하나만 참(true)라면 참을 반환한다. 2개의 항만 사용가능한거 아님. 여러개 가능
! !(not)는 부정의 의미, Boolean 값을 반전시킨다.
<반복문>
while(조건){
코드
코드
}
while문. while은 ~하는 동안의 의미를 가지고 있다. 뜻 그대로 괄호() 안의 조건이 성립하는 동안 while문 안의 코드들은 실행된다.
while(true){} 는 무한 반복이니 하면 위험.
for(초기화; 반복 지속 여부; 반복 실행){
코드;
}
for문. 이전의 언어들과 같은 형태라 이해하기 쉬울듯 하다.
한 번 돌때마다 $i 값이 1씩 커지며 총 5번 반복하는 코드다.
break 하나의 반복문을 탈출, '이 반복문에 더이상 일 없다~'
continue 지금 반복하고 있는 턴을 패스! 위의 코드에서는 안의 코드를 실행하지 않고 1 더해진 $i로 반복문 in..
함수
function 함수명( [인자...[,인자]] ){
코드
return 반환값;
}
위와 같은 형식으로 함수를 선언한다.
return 값 반환과 동시에 함수 종료.
인자
function get_arguments($arg1, $arg2){
return $arg1+$arg2;
}
함수를 선언할때 위와 같이 인자를 추가해놓으면, 함수를 호출할때 그에 맞는 개수의 인자를 주고 함수 내에서 그 인자를 사용할 수 있다.
위와 같이 복수개의 인자도 가능하다.
function put_serial($serial=1210){
$_serial = $serial;
}
이 코드는 함수 선언을 하며 인자에 기본값을 부여했다. 만약 함수를 호출할때 인자를 넣었다면 저 1210 대신 입력한 값이 들어간다. 허나 인자 없이 호출을 했을시 선언 당시에 주어진 기본값을 가지고 함수가 호출된다.
배열
<?php
$name1= array('guntak','loves','sogogi');
$name2=['guntak','loves', 'sogogi'];
?>
위는 같은 내용의 배열을 생성하는 방법 2가지를 모두 쓴것이다.
array( 배열에 넣을 값 )을 사용하거나 [배열에 넣을 값] 의 형태로 생성할 수 있다.
<?php
function get_members(){
return ['egoing', 'k8805', 'sorialgi'];
}
$tmp = get_members();
echo $tmp[1];
?>
get_members()를 하면 egoing, k8805, sorialgi 가 들어있는 배열이 반환되는데 그것을 $tmp에 할당했다.
이로써 $tmp 뒤에 [] 를 붙여 이 안에 인덱스 값을 넣어준다면, 배열 속 각각의 값에 접근할 수 있게된다. ex) $tmp[2]
<?php
function get_members(){
return ['egoing', 'k8805', 'sorialgi'];
}
$members = get_members();
for($i = 0; $i < count($members); $i++){
echo ucfirst($members[$i]).'<br />';
}
?>
5번째 라인까지의 코드는 $members=['egoing','k8805','sorialgi'];와 같다.
그 밑에서 for문을 사용하여 $member 배열의 하나하나의 데이터에 접근해 그 값의 맨 첫 글자를 대문자화시켜 출력한다.
count()는 괄호 안에 배열을 넣으면 배열에 저장된 값이 몇 개인지 반환한다.
ucfirst()는 안에 들어온 문자열의 가장 앞 글자를 대문자화 시켜 반환한다.
ucfirst에 대해 : https://www.php.net/manual/en/function.ucfirst.php
배열의 조작
[추가]
1.array_push
<?php
$arr=['a','b','c','d'];
array_push($arr, 'e'];
var_dump($arr);
?>
array_push()함수에 첫 인자로 추가받을 배열, 두번째 인자로 추가할 값을 넣어주면 들어간다잉~
2.array_merge
<?php
$li = ['a', 'b', 'c', 'd', ];
$li = array_merge($li, ['e','f']);
var_dump($li);
?>
push랑 똑같은데 복수의 값을 넣을 수 있다는게 차이점^^
[제거]
1.array_shift
<?php
$li = ['a', 'b', 'c', 'd', 'e', 'z'];
array_shift($li);
var_dump($li);
?>
배열의 첫번째 요소를 제거하는 방법이다. 위의 코드를 실행하면 'a'가 빠진 배열이 출력된다.
2.array_pop
<?php
$li = ['a', 'b', 'c', 'd', 'e', 'z'];
array_pop($li);
var_dump($li);
?>
배열의 마지막 요소를 제거하는 방법이다. 위의 코드를 실행하면 'z'가 빠진 배열이 출력된다.
[정렬]
1.sort
<?php
$li = ['c','e','a','b','d'];
sort($li);
var_dump($li);
?>
내림차순? 순서?대로 정렬해줘. 깔끔한 친구야
2.rsort
<?php
$li = ['c','e','a','b','d'];
rsort($li);
var_dump($li);
?>
역순으로 배열해준다잉. 청개구리야
연관배열
<?php
$grades = array('egoing'=>10, 'k8805'=>6, 'sorialgi'=>80);
?>
<?php
$grades = [];
$grades['egoing'] = 10;
$grades['k8805'] = 6;
$grades['sorialgi'] = 80;
var_dump($grades);
?>
파이썬에서 배운 딕셔너리 같은 개념인것 같다.
key와 value가 존재한다. 위의 두 코드는 같은 연관배열을 정의하는 두가지 방법이다.
***디따 신기함*** 나중에 한 번 더 보기
<?php
$grades = array('egoing'=>10, 'k8805'=>6, 'sorialgi'=>80);
foreach($grades as $key => $value){
echo "key: {$key} value:{$value}<br />";
}
?>
foreach 문은 $grades 위치의 배열에 담긴 요소의 숫자만큼 반복문을 실행. 실행될 때마다 요소의 키 값을 $key, 그 키에 대한 요소의 값을 $value에 할당한다. 위의 방법을 통해서 배열 안에 담긴 모든 값을 가져올 수 있다고 한다!!!!!!
워 게 임... 두둥,,
1.webhacking.kr old 6 (hint: php online compiler를 사용!)
이제는 별로 놀랍지도 않다. 아이디와 패스워드를 알려준다.
소스코드를 봐보자!
소스코드의 밑부분에 위의 코드가 있다. 아까 처음 페이지에 들어왔을때 출력한 부분을 담당하는거 같은데,
그러므로 현재 $decode_id는 "guest", $decode_pw는 "123qwe"가 저장되어 있음을 알 수 있다.
저 매력적으로 생긴 친구 solve(6)을 실행시키려면 $decode_id는 "guest"에서 "admin"으로, $decode_p는 "123qwe"에서 "nimda"로 바꿔놓아야한다.
id와 pw 모두 20번씩 디코딩 한게 각각 admin, nimda다!
노가다로 한 번 할려고 했는데 점점 길어지는게 너무 무섭다. 그냥 컴퓨터한테 시킬래여
주어진 소스파일과 반대로 인코딩을 하여 원래 값을 구해보고자 한다.
위의 코드를 실행하면
개길다. 이를 각각 user, password 쿠키값에 넣어준다. 가운데 길게 있는 str_replace 함수를 무시하는 이유는 20번 인코딩한 값에는 특수문자가 없기 때문에 될게 없당~
쿠키값을 각각 넣어주고 새로고침을 해주면 끄읕~
2.webhacking.kr old 33
이제 들어왔는데 틀렸대ㅡㅡ 소스코드를 봐주자
아까 문제보다 훨씬훨씬 짧다. 하 마음의 평화가 온다.
$_GET는 URL로 전해지는 정보를 받을때 사용하는 녀석이다. get이라는 이름으로 전해지는 데이터가 "hehe"면 Next 링크를 준다고 한다! 바로 실전에 옮긴다.
위와 같이 URL뒤에 ?를 붙여 데이터를 전해준다. get이라는 이름으로 "hehe"를 적고 엔따!!
하 Next가 활성화 되어있다...누른..다?
어쩐지 쉽다했다.. 다음 문제가 나온다,, 다시 view-source를 눌러본다.
오홍 아까는 GET 방식이더니 이번에는 POST 방식이다. 오늘 배운걸 그대로 써먹는다 후후
'post'라는 이름으로 "hehe"가 주어져야하고, 'post2'라는 이름으로 "hehe2"가 주어져야만 Next 링크가 활성화된다.
URL에 정보를 적어 넘겼던 방금 전과 달리 POST 방식은 URL 정보 전달로 해결되지 않는다. 그래서 어떻게 할지 고민중,,
Burpsuite도 써봤는데,, 잘 안된다. https://m.blog.naver.com/PostView.nhn?blogId=wwwkasa&logNo=221332141738&proxyReferer=https:%2F%2Fwww.google.com%2F
이거 보고 했는디,,,,
두번째 작전으로 돌입한다. 아까 GET 방식과 POST방식은 URL에 드러나고 안드러나고의 차이가 있었지만, 공통점이 있었다. html 코드에서 form 태그 안에서 text 타입의 input 태그에서 파파팍 전해졌었다!
그냥 form 태그를 만들면 안되나 시도해봤다..
현재 있는 주소가 level2.php이길래 실행도 저 php 파일로 실행해보았다.
form 태그를 만들어주었더니 이쁜 상자 2개가 생겼다. 첫번째가 post, 두번째가 post2이니 이에 맞는 값을 입력해보자.
submit 버튼을 안만들어서 급하게 추가했다.
맞게 입력하고 제출하였더니 404 not found 오류가 발생한다. 그 이유를 알아보니,,
post2를 posst2로 잘못 치는 짓을 저질렀다.
다시 간다..!
하 또 안되길래 너무 화가 나서 바람을 바깥 공기를 마시고 왔다. 후우우우우우우우우우우우우웅
왜일까!? method 속성을 input 태그에 넣은 것을 발견할 수 있을것이다,,
method 태그는 form태그다 건탁아,,?
바꿔주니 바로 통과인데,,왜 또 Next 냐
myip라는 이름으로 주어진 값과 $_SERVER['REMOTE_ADDR']과 같아야하는데,, $_SERVER가 뭐지
https://unabated.tistory.com/entry/PHP-SERVER-%ED%95%A8%EC%88%98 을 찾아보니
라고 한다. 내 IP..? 내 IP를 공개해야 하는 순간이 온거같다.
스킵! GET 형식이였기 때문에 URL뒤에 myip=~~~~를 붙여주었다.
아 참고로! 자기 ip 주소 확인은 네이버에 "내 아이피 주소"검색하는게 젤 쉬워요!
hint도 주는 착한 아이가 되었다.
password라는 이름으로 주어진 값과 md5(time())가 같아야 하는거 같다,, md5(time())이 뭐지?
찾아보니 뭐 암호화,,? 시키는 느낌인디,,
와 진짜 눈물난다 이거. 저기 hint로 주어지는 값은 time()이였고 새로고침 할때마다 바꼈다. 근데 그 time()값을 md5화(?)를 시켜야하니깐
http://www.md5.cz/이 사이트를 이용하여 지금의 time()값보다 여유분을 더해서 변형하고 그걸 입력한채 계속 새로고침했다..ㅠㅠㅠㅠㅠㅠㅠㅠㅠ진짜 너무 어렵다 이거
또 있네? ㅎㅎㅎㅎㅎㅎㅎㅎㅎ나 자야되는데,,? 놔줘,,
view-source를 해보자,,
imget라는 이름으로 들어온 값, impost라는 이름으로 주어진 값, imcookie라는 이름의 쿠키값으로 주어진 값들이 모두 true면 된다!!!
아까처럼 html 코드를 변형해보자!
진짜 명작이라고 생각했다. 아까 썻던 모든 기술을 쓰면서 <?php ?> 이 사이에 setcookie까지 딱 해주면서 나는 정말 이게 안되면 말이 안된다라고 생각을 했는데 안되는걸 보니 안되는것도 말이 되는구나를 느꼈다. 졸리다
다른 곳에 문제가 있는지 잘 모르겠지만 일단 위 캡처를 보면 php 부분이 주석처리 되었다. 왜지이이?
혹시 몰라서 head 부분에 php 문을 넣어봤는데 결과는 똑같다..
근데 생각해보니
이 친구가 있었다..!
html 코드는 이 상태로 가고!
간다..
하ㅠㅠㅠ
근데 또 Next네?
나의 모든걸 벗은 느낌이다.내 컴퓨터가 서버에 접속할때의 정보를 힌트로 줬다.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
test라는 이름의 쿠키값, md5화 한 내 ip가 서로 같아야 하고, post 형식으로 주어진 kk라는 이름의 값이 md5화 한 저 힌트값과 같아야 한다.
그럼 일단 저 힌트값을 md5화 해보자.아까 사용했던 사이트를 사용한다.
ip를 md5화 하는걸 여기서 보이면,, md5가 복원 가능한지 아닌지 잘 모르기 때문에 ,, 생략하도록 하겠당.
일단 우항은 준비완료 (###########저기 method="post" 안적어서 틀렸음!!!)
test라는 이름의 쿠키를 건내줄 준비도 완료!
제발ㅠㅠㅠㅠ
짱짱해커가 조금 더 가까워졌다,,, 삭님 후욱후욱
사용자의 ip에서 .을 모두 지우고 다 앞으로 땡겨서 저장했다.
그리고 내 아이피가 이름인 값을 get 방식으로 주고 그게 방금 .지워서 저장한 그것과 같으래여
이건 ip 주소 때문에 그냥 할게요오,,
extract()?
첫번째 if 문이 실행이 되버리면 $addr에는 현재 나의 ip 주소값이 저장되므로 두번째 중요한 if문을 못탄다. 그러므로 $_GET['addr']은 false여야한다. 그냥 addr이라는 이름으로 127.0.0.1을 주면 되지 않을까..?
쉬는 시간도 주나보다 ㅎㅎ
.= 은 문자열을 덧붙이는 연산자.
이건 그냥 저대로 복사해서 실행시켜보면 답이 나올거같은 기분?
ans라는 이름으로 get 방식을 사용해 전달된 값이 $answer와 같다면 성공.
하,,,,,,또 Next야 야!!!!!!!!!!!!!1
$ip라는 변수에 내 아이피 주소를 저장했다.
내 아이피 주소의 길이만큼 반복하면서 $i값을 ord($i)로 교체한다 . 여기서 ord()는
일단 여기까지 먼저 해볼까..? 이것도 공개 ㄴㄴ,, 그 다음으로 점도 다 없애준다
substr()은
근데 이것도 그냥,,,돌리면 되지 않을까
기술의 힘은 엄청나다.. 노가다로 하고 있던 내가 후회된다.
바로 나오넹
$ip는 ~~~ $answer는 ~~~~이다.
answerip/{$answer}_{$ip}.php이 주소로 가면 뭔가 될거같은 느낌? 일단 넣고 보는거다
그럼 주소는 "answerip/~~~~_~~~~~.php"
제 말 좀 들어주시겠습니까..? 진짜 제가 저거 딱 입력하니깐 "login plz"라는 문구가 출력이 되서,, 아 너무 오랫동안 접속해있어서 그런가 싶어서 ok를 누르고 로그인을 하고 다시 이 문제를 눌렀는데 아닛?? 이게 뭔가요
제 눈이 이상한거 아니죠..?
저거 -1 맞죠?????
하아아아아ㅏ아아아아아아ㅏ아아아아아ㅏ아아아ㅏ앙아ㅏ아아아아아아아ㅏ아아아아아아아아아아ㅏ아ㅏ아아아ㅏ아아아아아ㅏ아아아아아아ㅏ아아아아아아아ㅏ아아아아아아아아아아ㅏㅇ아아아아ㅏ아아ㅏㅇ아ㅏ아아아아
항복하겠습니당.
댓글
이 글 공유하기
다른 글
-
<2/2> 웹해킹 5주차 과제 뚜두두두두두두두두둥 [XSS]
<2/2> 웹해킹 5주차 과제 뚜두두두두두두두두둥 [XSS]
2020.05.15 -
<1/2>웹해킹 5주차 과제 뚜두두두두두두둥 [XSS]
<1/2>웹해킹 5주차 과제 뚜두두두두두두둥 [XSS]
2020.05.14 -
웹해킹 스터디 3주차 과제(Javascript 학습 & 워게임)
웹해킹 스터디 3주차 과제(Javascript 학습 & 워게임)
2020.04.07 -
웹해킹 스터디 2주차 과제
웹해킹 스터디 2주차 과제
2020.04.02