1.什麼是表單php
表單能夠收集用戶的信息和反饋意見,是網站管理者與瀏覽者之間溝通的橋樑。css
一個表單有三個基本組成部分: 表單標籤html
表單域:包含了文本框、密碼框、隱藏域、多行文本框、複選框、單選框、下拉選擇框和文件上傳框等前端
表單按鈕:包括提交按鈕、復位按鈕和通常按鈕.mysql
2.瀏覽器能夠解析運行什麼語言web
初步認識一個簡單的登陸界面是如何操做的,可是因爲數據庫語言爲了方便用戶使用,便有了較大漏洞,出現相似SQL注入、XSS注入等。這些注入很是巧妙,簡直防不勝防,咱們今天接觸到仍是最簡單的,只要使用關鍵詞過濾或者正則表達式就可完成避免這些被方法注入。可是仍是會有更高級的作法,而後又會出現相應的對策!這個就是一個相互鬥爭發展的過程!
經過apachectl start開啓Apach,使用netstat -aptn查看端口占用:在這裏apach2佔用端口80正則表達式
測試apache是否正常工做:在kali的火狐瀏覽器上輸入localhost:80(其實這裏的端口號就是/etc/apache2/ports.conf下設置的Apache監聽端口號,這裏的localhost是你的kali的IP地址(我這裏是192.168.47.133),因爲上個實驗的影響打開的是假裝的網頁)sql
去年上網絡編程課程時學過相似的內容,直接把內容拷進來了,其實就是幾張圖片和一些css數據庫
開啓sql服務/etc/init.d/mysql startapache
輸入mysql -u root –p,並根據提示輸入密碼,默認密碼爲p@ssw0rd,進入MySQL
輸入show databases;,能夠查看基本信息
能夠經過以下方式更改密碼:
·輸入use mysql;,選擇mysql數據庫 ·輸入select user, password, host from user;,mysql庫中的user表中存儲着用戶名、密碼與權限 ·輸入UPDATE user SET password=PASSWORD("新密碼") WHERE user='root'; ·輸入flush privileges;,更新權限 ·輸入quit退出
從新輸入mysql -u root –p,檢測新密碼可否成功使用,能成功登陸便可。
在Mysql中建庫建表,輸入以下
CREATE SCHEMA `20145320`; CREATE TABLE `20145320`.`users` ( `userid` INT NOT NULL COMMENT '', `username` VARCHAR(45) NULL COMMENT '', `password` VARCHAR(256) NULL COMMENT '', `enabled` VARCHAR(5) NULL COMMENT '', PRIMARY KEY (`userid`) COMMENT '');
向表中添加用戶
use 2014530; insert into users(userid,username,password,enabled) values(1,'20145320',password("88330016"),"TRUE");
在/var/www/html文件夾下輸入vim 20145320.html,將我去年的所寫的代碼修改一下
在一樣的目錄下輸入vim login.php,經過php實現對數據庫的鏈接
在火狐瀏覽器中輸入localhost:80/20145320.html,就能夠訪問本身的登錄頁面啦
在登陸頁面中輸入數據庫中存有的用戶名和密碼並點擊提交進行用戶認證登陸成功,輸入數據庫中沒有的就會認證失敗
最終登錄成功的樣子以下
這裏有個重大的漏洞!口令以明文形式展示在了用戶面前,雖然在數據庫中是以MD5壓縮的,可是在前端就被看得清清楚楚,更不要說我用burpsuite去截獲數據包了!知道這個我甚至都不須要
這個漏洞是由語法形成的漏洞,對剛剛本身創建的登陸網站進行注入!!
構造SQL注入語句:在用戶名輸入框中輸入' or 1=1#,密碼隨便輸入,這時候的合成後的SQL查詢語句爲select * from users where username='' or 1=1#' and password=md5('')
如下的兩句sql語句等價:
select * from users where username='' or 1=1#' and password=md5('')
select * from users where username='' or 1=1
「#」號的做用註釋掉後面的語句,因此後面就不用驗證口令的md5值,並且1=1永遠是都是成立的,即where子句老是爲真,因此可以成功登陸
分析一下出如今地址欄的這些參數'+or+1%3D1%23
,全部的空格符、標點符號、特殊字符以及其餘非ASCII字符都將被轉化成%xx格式的字符編碼(xx等於該字符在字符集表裏面的編碼的16進制數字),例如空格爲%20,等號爲%3D,井號爲%23,可是還有不會被此方法編碼的字符: *、~、-、.
';insert into users(userid,username,password,enabled) values(3,'aaa',password("aaa"),"TRUE");#
SELECT * FROM users WHERE username='';
insert into users(userid,username,password,enabled) values(3,'aaa',password("aaa"),"TRUE");
可是頁面跳轉是空白頁,以個人代碼來看也就意味着if ($result = $mysqli->query($query_str))不成立,即result爲fault。
這是php防範SQL攻擊的措施
能夠修改成$result = $mysqli->multi_query($query_str)實現多條SQL語句
可是我輸入用戶名aaa密碼aaa登陸是不成功的,爲了檢驗語句是否執行成功,我直接進了數據庫中查找,看起來顯然注入是沒有問題的。
聽說應該是$result->num_rows>0在我把query改成multi_query的時候出現了問題,因而參照別的同窗修改代碼爲:
我感受這個是在躲避問題,當多條語句SQL輸入時上面的if被執行,當只輸入一條SQL語句則兩個if被執行
';insert into users(userid,username,password,enabled) values(666,'aaa',password("aaa"),"TRUE");#
新插入一個用戶8.此時在登陸頁面輸入用戶名aaa密碼aaa,成功
輸入20145320能夠看見圖片