post注入和get注入一样,都是基于数据库没有对语句进行足够多的过滤,导致用户可以直接在url上执行sql语句。这两基本上没区别,但是基于post的注入在真实情况下会比get的多得多,最典型的post注入就是万能密码
万能密码
万能密码便是post注入的一种(也是sql注入),其原理也是因为后端没有进行好过滤,使得传入的sql语句被成功执行,使得用户即便输入的账号与密码错误也能成功执行。代码 ' or 1=1# 原理:
select * from stu where user='admin' where password='123'
这是一条标准的sql语句,基本上前端在登录框输入信息后,服务器得到响应,并向数据库中查找相应的user与password,都存在才可以正常登录。而万能密码便是添加上sql语句中的or来进行绕过(ps:前提,得存在sql注入的漏洞,这个只能试一试,不代表一定能成功),将or语句写入登录框后,数据库查询的语句代码如下,但是因为admin 与or 1=1 都在同一个
select * from stu where user='admin or 1=1' and password='123'
字符串下,如果直接执行会把‘admin or 1=1’一整串当成账号登录,因此需要使or1=1逃逸出来,因此需要在前面加个‘ 语句变成下面这样,使其成为一条or的sql执行语句,但是后面又会多出来个
select * from stu where user='admin' or 1=1' and password='123'
引号,sql中引号要成双成对的,所以通过一个注释符将后面全部注释掉,完成语句构造。
select * from stu where user='admin' or 1=1 #'password='123'
(ps:因为or 1=1 永远为真,所以要是存在sql漏洞执行or后便会当真,后续的密码通过注释也不再查看,直接登录。)
一个小例子 源自buuctf(一个ctf的靶场 BUUCTF在线评测 (buuoj.cn) 没事干可以去里面被折磨)
ps(放在密码处也可以,原理都一样)
post注入
1.less-11
通过docker登录靶场(本篇基于上一章的环境继续进行)(ps:这里我没写怎么搭建docker,可以看看别的佬咋搭的,当前阶段是学校任务罢了(有空一定写))
登录页面,可以直接使用万能密码('or 1=1#) 查看情况
直接成功登录(ps:很多真实环境都可以靠这个直接进去,想挖edu的看到有个输入框就可以去输一下)
至于判断数据库,表,字段数量,字段名的话都可以靠最基本判断字段的方法进入,和之前基本上没差,不过对于这种post注入可以在搜索框里面进行尝试,但要把or 1=1这个给去掉,不然直接就登进去了。(ps:'这个单引号和注释不能去,得靠他们构建sql语句进行查询)
上面两个图可以看出,这表只有两个字段,附上代码:
查数据库名和版本:-1' union select database(),version() #
查表:-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
查字段:-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
最终数据:-1' union select 1,group_concat(username,0x3a,password) from users #
(ps:这个0x3a是一个十六数,转为ascill吗值后代表的是:(冒号),可以更好分割用户名和密码)
但是,通常情况下,这种搜索栏通常都会做一个限制,正常情况下是没法输入这么多数据来查看信息的(虽然万能密码进去了也不怎么用查),所以,这个时候就可以通过bp抓包来对其信息进行分析。(ps:如果他有过滤这些关键字就另当别论)
通过burpusite进行抓包分析(kali自带,这里先不讲具体如何使用(因为准备在另一篇讲),有兴趣的先看看别的佬)
进入kali后,将抓到的数据通过ctrl+r(或者右键选则) 加入到repeater模块(这模块叫重放器,可以显示更改代码后服务器所响应的页面,但数据不会进入服务器,可以拿来用作验证漏洞是否存在或者木马是否上传之类的)
而后可以把查表查库的语句输入进去,得到相应的数据
Post注入(less-12)
上述讲的是一个最平常的最大众的万能密码的使用,下边来个稍微有点限制的,首先,快乐万能密码(ᕑᗢᓫ∗)˒
寄了
判断有没有潜在的get注入点(虽然这是个靶场,但也可以按照正常思维进行测试),发现全部都有回显,sql语句没有执行,那这可能表明html页面上不太好发现,所以抓个包看看
随便输入一串账号密码,发现发送的数据没有任何回显,页面也只有一个fail的提示。这时,由于万能密码已经测试过了,get也测试过了都没有成功,那么普通人正常情况下有那么以下几种选择(1.直接退出页面(这种思想通常不应该存在)2.使用一些更加新鲜的方法进行注入点的测试3.使用sqlmap硬来(在后面))
通常像这种破破烂烂的界面是很容易出货的,(并且这是个靶场,一定有货)所以可以使用我前面一章给的小思路,用一些其他符号来找(这里的url是get方法实现,那咱在bp环境下,把符号写在这种uname后面的账号就行了)
ps:可能还有其他字符能测试,但我不知道୧⍤⃝
这里附上一个没找到和找到的截图,可以看到这变在输入一个反斜杠\的时候,出现了一个报错,(sql的报错从synatx后面开始看就行了) 发现这个提示似乎是因为在设计数据库的时候,他采用的的sql语句似乎是一个通过")来进行闭合的数据,发现问题后,可以对万能密码进行更改看看是否可以进行连接。
根据上面所说的万能密码的原理,根据发现的报错信息,将’改成了报错中看到的"),让or进行逃逸,通过测试成功登录了该页面。可以再看一下代码验证以下(因为该环境基于上篇,使用docker搭建的,所以搭建docker的虚拟机可以直接查看源代码)
ps(别觉得前面就一定得是空的,咱万能密码没这么矫情)
可以发现这里是通过一个php代码编译的,并且其中的数据也是使用"与()进行的闭合(ps:没看懂可能得先去学一下php¯\_(ツ)_/¯) 确定这玩意是个uname=("xxx")这样的闭合方式。
基于post注入的sqlmap使用方法
有两种方法(ps:可能还有更多,但我就会这两个)
1.在桌面上创建一个后缀为txt的文本 2.将repeater内的数据(这个RAW下的)全部复制到文本里面。(这样子存储速度会快一点,但要是啥没复制到可能会出问题)
2.右键repeater后面的空白处,按下面的方法进行保存(这样子存储会慢一点,但因为数据是直接从bp全部复制的,不会出现复制漏或者别的情况)
两种保存方法的使用:
1.(通过手动复制的方法使用) 先看一下数据长啥样,cat xx.txt 查看数据是否完成,而后根据
sqlmap -r "/home/kali/Desktop/77.txt" -p uname :其中 -r 表示读取文件 后面那个则是文件存放路径(也就是保存后的txt文件)其中,-p 则是指定需要探测的地方(这里可以看一下cat展示的文件,其中有uname和passwd)这里指专门对uname进行是否存在注入点的判断。根据回复信息,发现此地存在注入点。
ps(sqlmap -r "/home/kali/Desktop/77.txt" -p uname --technique -E (这样也行,这个technique是指定选中哪种注入(布尔,报错,盲注等等),而-E 则表示指定检测报错注入。不加这个technique是默认全部方法进行探测的,我通常不加。【除非啥指定情况】,但是如果确定了哪种注入类型,加上这个会快很多。))
爆破数据得到表,后续就根据此前(第一篇)的操作进行数据拿取
2.(直接保存bp文件的使用)启动sqlmap进行探测 ,这种探测方法其实就是上文所说的硬来,在不确定是否存在sql注入的情况下(比如一些不是登录框,但和数据库有交互的地方【比如搜索栏】),无法判断注入点,可以直接把post包(通过第二种方式复制得到的)放到sqlmap中让它进行检测。(不建议使用,因为有时候确实页面里存在sql注入,但需要通过手动修改一些参数才能发现,虽然sqlmap强大,但这种硬来不是说只要有就能查出来的,而通过sqlmap查询后没有发现注入点,就会产生这个地方没问题的假象。所以这种应该把能想到的东西全部尝试完没辙再测试)(ps:如果sqlmap硬扫没扫到,但通过手动更改参数后发现注入点,丢进来的话应该还是能扫到的)
基础的post注入就完事辣
标签:11,ps,12,密码,语句,sql,post,注入 From: https://blog.csdn.net/weixin_74182283/article/details/137133841